|
|
1.1 root 1: /* osk.c */
2:
3: /* ------------------------------------------------------------------- *
4: |
5: | OS9Lib: stat(), fstat()
6: |
7: |
8: | Copyright (c) 1988 by Wolfgang Ocker, Puchheim,
9: | Ulli Dessauer, Germering and
10: | Reimer Mellin, Muenchen
11: | (W-Germany)
12: |
13: | This programm can be copied and distributed freely for any
14: | non-commercial purposes. It can only be incorporated into
15: | commercial software with the written permission of the authors.
16: |
17: | If you should modify this program, the authors would appreciate
18: | a notice about the changes. Please send a (context) diff or the
19: | complete source to:
20: |
21: | address: Wolfgang Ocker
22: | Lochhauserstrasse 35a
23: | D-8039 Puchheim
24: | West Germany
25: |
26: | e-mail: [email protected], [email protected], [email protected]
27: | pyramid!tmpmbx!recco!weo
28: | pyramid!tmpmbx!nitmar!ud
29: | pyramid!tmpmbx!ramsys!ram
30: |
31: * ----------------------------------------------------------------- */
32:
33: #ifdef OSK
34:
35: #define PATCHLEVEL 1
36:
37: #ifndef VIREC
38: #include <stdio.h>
39: #include "osk.h"
40: #include <modes.h>
41: #include <errno.h>
42: #endif
43: #include <signal.h>
44: #include <sgstat.h>
45: #include <sg_codes.h>
46: #include <direct.h>
47:
48: /*
49: * f s t a t
50: */
51: int fstat(fd, buff)
52: int fd;
53: struct stat *buff;
54: {
55: struct fildes ftmp;
56: struct tm ttmp;
57: struct _sgr fopt;
58:
59: if (_gs_gfd(fd, &ftmp, 16) < 0) /* 16 insteat of sizeof(struct fildes) */
60: return(-1); /* used due to a bug in stupid os9net */
61:
62: if (_gs_opt(fd, &fopt) < 0)
63: return(-1);
64:
65: ttmp.tm_year = (int) ftmp.fd_date[0];
66: ttmp.tm_mon = (int) ftmp.fd_date[1] - 1;
67: ttmp.tm_mday = (int) ftmp.fd_date[2];
68: ttmp.tm_hour = (int) ftmp.fd_date[3];
69: ttmp.tm_min = (int) ftmp.fd_date[4];
70: ttmp.tm_sec = 0;
71: ttmp.tm_isdst = -1;
72:
73: buff->st_atime = buff->st_mtime = mktime(&ttmp);
74:
75: ttmp.tm_year = (int) ftmp.fd_dcr[0];
76: ttmp.tm_mon = (int) ftmp.fd_dcr[1] - 1;
77: ttmp.tm_mday = (int) ftmp.fd_dcr[2];
78: ttmp.tm_hour = ttmp.tm_min = ttmp.tm_sec = 0;
79: ttmp.tm_isdst = -1;
80:
81: buff->st_ctime = mktime(&ttmp);
82:
83: memcpy(&(buff->st_size), ftmp.fd_fsize, sizeof(long)); /* misalignment! */
84: buff->st_uid = ftmp.fd_own[1];
85: buff->st_gid = ftmp.fd_own[0];
86: buff->st_mode = ftmp.fd_att;
87: buff->st_nlink = ftmp.fd_link;
88:
89: buff->st_ino = fopt._sgr_fdpsn;
90: buff->st_dev = fopt._sgr_dvt;
91:
92: return(0);
93: }
94:
95: /*
96: * s t a t
97: */
98: int stat(filename, buff)
99: char *filename;
100: struct stat *buff;
101: {
102: register int i, ret;
103:
104: if ((i = open(filename, S_IREAD)) < 0)
105: if ((i = open(filename, S_IFDIR | S_IREAD)) < 0)
106: return(-1);
107:
108: ret = fstat(i, buff);
109: close(i);
110:
111: return(ret);
112: }
113:
114: /*
115: unix library functions mist in OSK
116: Author: Peter Reinig
117: */
118:
119: /* NOTE: this version of link() is only capable of renaming files, not true
120: * UNIX-style linking. That's okay, though, because elvis only uses it for
121: * renaming.
122: */
123: link(from,to)
124: char *from,*to;
125: {
126: char *buffer;
127: int status;
128: char *malloc();
129:
130: if ((buffer = malloc(strlen(from) + strlen(to) + 12)) == NULL)
131: return -1;
132: sprintf(buffer,"rename %s %s\n",from,to);
133: status = system(buffer);
134: free(buffer);
135: return status;
136: }
137:
138: typedef (*procref)();
139: #define MAX_SIGNAL 10
140:
141: extern exit();
142:
143: static int (*sig_table[MAX_SIGNAL])();
144: static int _sig_install = 0;
145:
146: sig_handler(sig)
147: int sig;
148: {
149: if ((int) sig_table[sig] > MAX_SIGNAL)
150: sig_table[sig](sig);
151: }
152:
153: procref signal(sig,func)
154: int sig;
155: int (*func)();
156: {
157: int i, (*sav)();
158:
159: if (!_sig_install) {
160: for (i=0; i < MAX_SIGNAL; i++)
161: sig_table[i] = exit;
162: _sig_install = 1;
163: intercept(sig_handler);
164: }
165: sav = sig_table[sig];
166: switch ((int) func) {
167: case SIG_DFL : sig_table[sig] = exit;
168: break;
169: case SIG_IGN : sig_table[sig] = 0;
170: break;
171: default : sig_table[sig] = func;
172: break;
173: }
174: return sav;
175: }
176:
177: perror(str)
178: char *str;
179: {
180: static int path = 0;
181: if (!path && (path = open("/dd/sys/Errmsg", S_IREAD)) == -1) {
182: fprintf(stderr,"Can\'t open error message file\n");
183: path = 0;
184: }
185: if (str && *str) {
186: fprintf(stderr,"%s: ",str);
187: fflush(stderr);
188: }
189: prerr(path,(short) errno);
190: }
191:
192: isatty(fd)
193: int fd;
194: {
195: struct sgbuf buffer;
196: char type;
197:
198: _gs_opt(fd,&buffer);
199: type = buffer.sg_class;
200: if (type == DT_SCF)
201: return 1;
202: else
203: return 0;
204: }
205: #endif /* OSK */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.