ยปCore Development>Code coverage>RISCOS/Modules/riscosmodule.c

Python code coverage for RISCOS/Modules/riscosmodule.c

#countcontent
1n/a/* RISCOS module implementation */
2n/a
3n/a#include "oslib/osfscontrol.h"
4n/a#include "oslib/osgbpb.h"
5n/a#include "oslib/os.h"
6n/a#include "oslib/osfile.h"
7n/a#include "unixstuff.h"
8n/a
9n/a#include <sys/fcntl.h>
10n/a
11n/a#include "Python.h"
12n/a#include "structseq.h"
13n/a
14n/a#include <errno.h>
15n/a
16n/astatic os_error *e;
17n/a
18n/a/*static PyObject *RiscosError;*/ /* Exception riscos.error */
19n/a
20n/astatic PyObject *riscos_error(char *s)
21n/a{
22n/a PyErr_SetString(PyExc_OSError, s);
23n/a return NULL;
24n/a}
25n/a
26n/astatic PyObject *riscos_oserror(void)
27n/a{
28n/a return riscos_error(e->errmess);
29n/a}
30n/a
31n/a
32n/a/* RISCOS file commands */
33n/a
34n/astatic PyObject *
35n/ariscos_remove(PyObject *self, PyObject *args)
36n/a{
37n/a char *path1;
38n/a if (!PyArg_ParseTuple(args, "s:remove", &path1)) return NULL;
39n/a if (remove(path1)) return PyErr_SetFromErrno(PyExc_OSError);
40n/a Py_INCREF(Py_None);
41n/a return Py_None;
42n/a}
43n/a
44n/astatic PyObject *
45n/ariscos_rename(PyObject *self, PyObject *args)
46n/a{
47n/a char *path1, *path2;
48n/a if (!PyArg_ParseTuple(args, "ss:rename", &path1, &path2))
49n/a return NULL;
50n/a if (rename(path1,path2)) return PyErr_SetFromErrno(PyExc_OSError);
51n/a Py_INCREF(Py_None);
52n/a return Py_None;
53n/a}
54n/a
55n/astatic PyObject *
56n/ariscos_system(PyObject *self, PyObject *args)
57n/a{
58n/a char *command;
59n/a if (!PyArg_ParseTuple(args, "s:system", &command)) return NULL;
60n/a return PyInt_FromLong(system(command));
61n/a}
62n/a
63n/astatic PyObject *
64n/ariscos_chdir(PyObject *self, PyObject *args)
65n/a{
66n/a char *path;
67n/a if (!PyArg_ParseTuple(args, "s:chdir", &path)) return NULL;
68n/a e=xosfscontrol_dir(path);
69n/a if(e) return riscos_oserror();
70n/a Py_INCREF(Py_None);
71n/a return Py_None;
72n/a}
73n/a
74n/astatic PyObject *
75n/acanon(char *path)
76n/a{
77n/a int len;
78n/a PyObject *obj;
79n/a char *buf;
80n/a e=xosfscontrol_canonicalise_path(path,0,0,0,0,&len);
81n/a if(e) return riscos_oserror();
82n/a obj=PyString_FromStringAndSize(NULL,-len);
83n/a if(obj==NULL) return NULL;
84n/a buf=PyString_AsString(obj);
85n/a e=xosfscontrol_canonicalise_path(path,buf,0,0,1-len,&len);
86n/a if(len!=1) return riscos_error("Error expanding path");
87n/a if(!e) return obj;
88n/a Py_DECREF(obj);
89n/a return riscos_oserror();
90n/a}
91n/a
92n/astatic PyObject *
93n/ariscos_getcwd(PyObject *self, PyObject *unused)
94n/a{
95n/a return canon("@");
96n/a}
97n/a
98n/astatic PyObject *
99n/ariscos_expand(PyObject *self, PyObject *args)
100n/a{
101n/a char *path;
102n/a if (!PyArg_ParseTuple(args, "s:expand", &path)) return NULL;
103n/a return canon(path);
104n/a}
105n/a
106n/astatic PyObject *
107n/ariscos_mkdir(PyObject *self, PyObject *args)
108n/a{
109n/a char *path;
110n/a int mode;
111n/a if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode)) return NULL;
112n/a e=xosfile_create_dir(path,0);
113n/a if(e) return riscos_oserror();
114n/a Py_INCREF(Py_None);
115n/a return Py_None;
116n/a}
117n/a
118n/astatic PyObject *
119n/ariscos_listdir(PyObject *self, PyObject *args)
120n/a{
121n/a char *path,buf[256];
122n/a PyObject *d, *v;
123n/a int c=0,count;
124n/a if (!PyArg_ParseTuple(args, "s:listdir", &path)) return NULL;
125n/a d=PyList_New(0);
126n/a if(!d) return NULL;
127n/a for(;;)
128n/a { e=xosgbpb_dir_entries(path,(osgbpb_string_list*)buf,
129n/a 1,c,256,0,&count,&c);
130n/a if(e)
131n/a { Py_DECREF(d);return riscos_oserror();
132n/a }
133n/a if(count)
134n/a { v=PyString_FromString(buf);
135n/a if(!v) { Py_DECREF(d);return 0;}
136n/a if(PyList_Append(d,v)) {Py_DECREF(d);Py_DECREF(v);return 0;}
137n/a }
138n/a if(c==-1) break;
139n/a }
140n/a return d;
141n/a}
142n/a
143n/aPyDoc_STRVAR(stat_result__doc__,
144n/a"stat_result: Result from stat or lstat.\n\n\
145n/aThis object may be accessed either as a tuple of\n\
146n/a (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
147n/aor via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\
148n/a\n\
149n/aRiscOS: The fields st_ftype, st_attrs, and st_obtype are also available.\n\
150n/a\n\
151n/aSee os.stat for more information.");
152n/a
153n/astatic PyStructSequence_Field stat_result_fields[] = {
154n/a { "st_mode", "protection bits" },
155n/a { "st_ino", "inode" },
156n/a { "st_dev", "device" },
157n/a { "st_nlink", "number of hard links" },
158n/a { "st_uid", "user ID of owner" },
159n/a { "st_gid", "group ID of owner" },
160n/a { "st_size", "total size, in bytes" },
161n/a { "st_atime", "time of last access" },
162n/a { "st_mtime", "time of last modification" },
163n/a { "st_ctime", "time of last change" },
164n/a { "st_ftype", "file type" },
165n/a { "st_attrs", "attributes" },
166n/a { "st_obtype", "object type" },
167n/a { 0 }
168n/a};
169n/a
170n/astatic PyStructSequence_Desc stat_result_desc = {
171n/a "riscos.stat_result",
172n/a stat_result__doc__,
173n/a stat_result_fields,
174n/a 13
175n/a};
176n/a
177n/astatic PyTypeObject StatResultType;
178n/a
179n/astatic PyObject *
180n/ariscos_stat(PyObject *self, PyObject *args)
181n/a{
182n/a PyObject *v;
183n/a char *path;
184n/a int ob,len;
185n/a bits t=0;
186n/a bits ld,ex,at,ft,mode;
187n/a if (!PyArg_ParseTuple(args, "s:stat", &path)) return NULL;
188n/a e=xosfile_read_stamped_no_path(path,&ob,&ld,&ex,&len,&at,&ft);
189n/a if(e) return riscos_oserror();
190n/a switch (ob)
191n/a { case osfile_IS_FILE:mode=0100000;break; /* OCTAL */
192n/a case osfile_IS_DIR:mode=040000;break;
193n/a case osfile_IS_IMAGE:mode=0140000;break;
194n/a default:return riscos_error("Not found");
195n/a }
196n/a if(ft!=-1) t=unixtime(ld,ex);
197n/a mode|=(at&7)<<6;
198n/a mode|=((at&112)*9)>>4;
199n/a
200n/a v = PyStructSequence_New(&StatResultType);
201n/a
202n/a PyStructSequence_SET_ITEM(v, 0,
203n/a PyInt_FromLong((long) mode)); /*st_mode*/
204n/a PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) 0)); /*st_ino*/
205n/a PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long) 0)); /*st_dev*/
206n/a PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long) 0)); /*st_nlink*/
207n/a PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long) 0)); /*st_uid*/
208n/a PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long) 0)); /*st_gid*/
209n/a PyStructSequence_SET_ITEM(v, 6,
210n/a PyInt_FromLong((long) len)); /*st_size*/
211n/a PyStructSequence_SET_ITEM(v, 7, PyInt_FromLong((long) t)); /*st_atime*/
212n/a PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) t)); /*st_mtime*/
213n/a PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) t)); /*st_ctime*/
214n/a PyStructSequence_SET_ITEM(v, 10,
215n/a PyInt_FromLong((long) ft)); /*file type*/
216n/a PyStructSequence_SET_ITEM(v, 11,
217n/a PyInt_FromLong((long) at)); /*attributes*/
218n/a PyStructSequence_SET_ITEM(v, 12,
219n/a PyInt_FromLong((long) ob)); /*object type*/
220n/a
221n/a if (PyErr_Occurred()) {
222n/a Py_DECREF(v);
223n/a return NULL;
224n/a }
225n/a
226n/a return v;
227n/a}
228n/a
229n/astatic PyObject *
230n/ariscos_chmod(PyObject *self,PyObject *args)
231n/a{
232n/a char *path;
233n/a bits mode;
234n/a bits attr;
235n/a attr=(mode&0x700)>>8;
236n/a attr|=(mode&7)<<4;
237n/a if (!PyArg_ParseTuple(args, "si:chmod", &path,(int*)&mode)) return NULL;
238n/a e=xosfile_write_attr(path,attr);
239n/a if(e) return riscos_oserror();
240n/a Py_INCREF(Py_None);
241n/a return Py_None;
242n/a}
243n/a
244n/a
245n/astatic PyObject *
246n/ariscos_utime(PyObject *self, PyObject *args)
247n/a{
248n/a char *path;
249n/a long atime, mtime;
250n/a PyObject* arg;
251n/a
252n/a if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
253n/a return NULL;
254n/a
255n/a if (arg == Py_None) {
256n/a /* optional time values not given */
257n/a Py_BEGIN_ALLOW_THREADS
258n/a e=xosfile_stamp(path);
259n/a Py_END_ALLOW_THREADS
260n/a if(e) return riscos_oserror();
261n/a }
262n/a else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
263n/a PyErr_SetString(PyExc_TypeError,
264n/a "utime() arg 2 must be a tuple (atime, mtime)");
265n/a return NULL;
266n/a }
267n/a else {
268n/a /* catalogue info*/
269n/a fileswitch_object_type obj_type;
270n/a bits load_addr, exec_addr;
271n/a int size;
272n/a fileswitch_attr attr;
273n/a
274n/a /* read old catalogue info */
275n/a Py_BEGIN_ALLOW_THREADS
276n/a e=xosfile_read_no_path(path, &obj_type, &load_addr, &exec_addr, &size, &attr);
277n/a Py_END_ALLOW_THREADS
278n/a if(e) return riscos_oserror();
279n/a
280n/a /* check if load and exec address really contain filetype and date */
281n/a if ( (load_addr & 0xFFF00000U) != 0xFFF00000U)
282n/a return riscos_error("can't set date for object with load and exec addresses");
283n/a
284n/a /* convert argument mtime to RISC OS load and exec address */
285n/a if(acorntime(&exec_addr, &load_addr, (time_t) mtime))
286n/a return riscos_oserror();
287n/a
288n/a /* write new load and exec address */
289n/a Py_BEGIN_ALLOW_THREADS
290n/a e = xosfile_write(path, load_addr, exec_addr, attr);
291n/a Py_END_ALLOW_THREADS
292n/a if(e) return riscos_oserror();
293n/a }
294n/a
295n/a Py_INCREF(Py_None);
296n/a return Py_None;
297n/a}
298n/a
299n/astatic PyObject *
300n/ariscos_settype(PyObject *self, PyObject *args)
301n/a{
302n/a char *path,*name;
303n/a int type;
304n/a if (!PyArg_ParseTuple(args, "si:settype", &path,&type))
305n/a {
306n/a PyErr_Clear();
307n/a if (!PyArg_ParseTuple(args, "ss:settype", &path,&name)) return NULL;
308n/a e=xosfscontrol_file_type_from_string(name,(bits*)&type);
309n/a if(e) return riscos_oserror();
310n/a }
311n/a e=xosfile_set_type(path,type);
312n/a if(e) return riscos_oserror();
313n/a Py_INCREF(Py_None);
314n/a return Py_None;
315n/a}
316n/a
317n/astatic PyObject *
318n/ariscos_getenv(PyObject *self, PyObject *args)
319n/a{
320n/a char *name,*value;
321n/a if(!PyArg_ParseTuple(args,"s:getenv",&name)) return NULL;
322n/a value=getenv(name);
323n/a if(value) return PyString_FromString(value);
324n/a Py_INCREF(Py_None);
325n/a return Py_None;
326n/a}
327n/a
328n/astatic PyObject *
329n/ariscos_putenv(PyObject *self, PyObject *args)
330n/a{
331n/a char *name,*value;
332n/a int len;
333n/a os_var_type type=os_VARTYPE_LITERAL_STRING;
334n/a if(!PyArg_ParseTuple(args,"ss|i:putenv",&name,&value,&type)) return NULL;
335n/a if(type!=os_VARTYPE_STRING&&type!=os_VARTYPE_MACRO&&type!=os_VARTYPE_EXPANDED
336n/a &&type!=os_VARTYPE_LITERAL_STRING)
337n/a return riscos_error("Bad putenv type");
338n/a len=strlen(value);
339n/a if(type!=os_VARTYPE_LITERAL_STRING) len++;
340n/a /* Other types need null terminator! */
341n/a e=xos_set_var_val(name,(byte*)value,len,0,type,0,0);
342n/a if(e) return riscos_oserror();
343n/a Py_INCREF(Py_None);
344n/a return Py_None;
345n/a}
346n/a
347n/astatic PyObject *
348n/ariscos_delenv(PyObject *self, PyObject *args)
349n/a{
350n/a char *name;
351n/a if(!PyArg_ParseTuple(args,"s:delenv",&name)) return NULL;
352n/a e=xos_set_var_val(name,NULL,-1,0,0,0,0);
353n/a if(e) return riscos_oserror();
354n/a Py_INCREF(Py_None);
355n/a return Py_None;
356n/a}
357n/a
358n/astatic PyObject *
359n/ariscos_getenvdict(PyObject *self, PyObject *args)
360n/a{
361n/a PyObject *dict;
362n/a char value[257];
363n/a char *which="*";
364n/a int size;
365n/a char *context=NULL;
366n/a if(!PyArg_ParseTuple(args,"|s:getenvdict",&which)) return NULL;
367n/a dict = PyDict_New();
368n/a if (!dict) return NULL;
369n/a /* XXX This part ignores errors */
370n/a while(!xos_read_var_val(which,value,sizeof(value)-1,(int)context,
371n/a os_VARTYPE_EXPANDED,&size,(int *)&context,0))
372n/a { PyObject *v;
373n/a value[size]='\0';
374n/a v = PyString_FromString(value);
375n/a if (v == NULL) continue;
376n/a PyDict_SetItemString(dict, context, v);
377n/a Py_DECREF(v);
378n/a }
379n/a return dict;
380n/a}
381n/a
382n/astatic PyMethodDef riscos_methods[] = {
383n/a
384n/a {"unlink", riscos_remove, METH_VARARGS},
385n/a {"remove", riscos_remove, METH_VARARGS},
386n/a {"rename", riscos_rename, METH_VARARGS},
387n/a {"system", riscos_system, METH_VARARGS},
388n/a {"rmdir", riscos_remove, METH_VARARGS},
389n/a {"chdir", riscos_chdir, METH_VARARGS},
390n/a {"getcwd", riscos_getcwd, METH_NOARGS},
391n/a {"expand", riscos_expand, METH_VARARGS},
392n/a {"mkdir", riscos_mkdir, METH_VARARGS},
393n/a {"listdir", riscos_listdir, METH_VARARGS},
394n/a {"stat", riscos_stat, METH_VARARGS},
395n/a {"lstat", riscos_stat, METH_VARARGS},
396n/a {"chmod", riscos_chmod, METH_VARARGS},
397n/a {"utime", riscos_utime, METH_VARARGS},
398n/a {"settype", riscos_settype, METH_VARARGS},
399n/a {"getenv", riscos_getenv, METH_VARARGS},
400n/a {"putenv", riscos_putenv, METH_VARARGS},
401n/a {"delenv", riscos_delenv, METH_VARARGS},
402n/a {"getenvdict", riscos_getenvdict, METH_VARARGS},
403n/a {NULL, NULL} /* Sentinel */
404n/a};
405n/a
406n/astatic int
407n/ains(PyObject *module, char *symbol, long value)
408n/a{
409n/a return PyModule_AddIntConstant(module, symbol, value);
410n/a}
411n/a
412n/a
413n/astatic int
414n/aall_ins(PyObject *d)
415n/a{
416n/a#ifdef F_OK
417n/a if (ins(d, "F_OK", (long)F_OK)) return -1;
418n/a#endif
419n/a#ifdef R_OK
420n/a if (ins(d, "R_OK", (long)R_OK)) return -1;
421n/a#endif
422n/a#ifdef W_OK
423n/a if (ins(d, "W_OK", (long)W_OK)) return -1;
424n/a#endif
425n/a#ifdef X_OK
426n/a if (ins(d, "X_OK", (long)X_OK)) return -1;
427n/a#endif
428n/a#ifdef NGROUPS_MAX
429n/a if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
430n/a#endif
431n/a#ifdef TMP_MAX
432n/a if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
433n/a#endif
434n/a#ifdef WCONTINUED
435n/a if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1;
436n/a#endif
437n/a#ifdef WNOHANG
438n/a if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
439n/a#endif
440n/a#ifdef WUNTRACED
441n/a if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1;
442n/a#endif
443n/a#ifdef O_RDONLY
444n/a if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
445n/a#endif
446n/a#ifdef O_WRONLY
447n/a if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
448n/a#endif
449n/a#ifdef O_RDWR
450n/a if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
451n/a#endif
452n/a#ifdef O_NDELAY
453n/a if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
454n/a#endif
455n/a#ifdef O_NONBLOCK
456n/a if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
457n/a#endif
458n/a#ifdef O_APPEND
459n/a if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
460n/a#endif
461n/a#ifdef O_DSYNC
462n/a if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
463n/a#endif
464n/a#ifdef O_RSYNC
465n/a if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
466n/a#endif
467n/a#ifdef O_SYNC
468n/a if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
469n/a#endif
470n/a#ifdef O_NOCTTY
471n/a if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
472n/a#endif
473n/a#ifdef O_CREAT
474n/a if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
475n/a#endif
476n/a#ifdef O_EXCL
477n/a if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
478n/a#endif
479n/a#ifdef O_TRUNC
480n/a if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
481n/a#endif
482n/a#ifdef O_BINARY
483n/a if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
484n/a#endif
485n/a#ifdef O_TEXT
486n/a if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
487n/a#endif
488n/a#ifdef O_LARGEFILE
489n/a if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
490n/a#endif
491n/a
492n/a/* MS Windows */
493n/a#ifdef O_NOINHERIT
494n/a /* Don't inherit in child processes. */
495n/a if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1;
496n/a#endif
497n/a#ifdef _O_SHORT_LIVED
498n/a /* Optimize for short life (keep in memory). */
499n/a /* MS forgot to define this one with a non-underscore form too. */
500n/a if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1;
501n/a#endif
502n/a#ifdef O_TEMPORARY
503n/a /* Automatically delete when last handle is closed. */
504n/a if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1;
505n/a#endif
506n/a#ifdef O_RANDOM
507n/a /* Optimize for random access. */
508n/a if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1;
509n/a#endif
510n/a#ifdef O_SEQUENTIAL
511n/a /* Optimize for sequential access. */
512n/a if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1;
513n/a#endif
514n/a
515n/a/* GNU extensions. */
516n/a#ifdef O_DIRECT
517n/a /* Direct disk access. */
518n/a if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1;
519n/a#endif
520n/a#ifdef O_DIRECTORY
521n/a /* Must be a directory. */
522n/a if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1;
523n/a#endif
524n/a#ifdef O_NOFOLLOW
525n/a /* Do not follow links. */
526n/a if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
527n/a#endif
528n/a
529n/a /* These come from sysexits.h */
530n/a#ifdef EX_OK
531n/a if (ins(d, "EX_OK", (long)EX_OK)) return -1;
532n/a#endif /* EX_OK */
533n/a#ifdef EX_USAGE
534n/a if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1;
535n/a#endif /* EX_USAGE */
536n/a#ifdef EX_DATAERR
537n/a if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1;
538n/a#endif /* EX_DATAERR */
539n/a#ifdef EX_NOINPUT
540n/a if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1;
541n/a#endif /* EX_NOINPUT */
542n/a#ifdef EX_NOUSER
543n/a if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1;
544n/a#endif /* EX_NOUSER */
545n/a#ifdef EX_NOHOST
546n/a if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1;
547n/a#endif /* EX_NOHOST */
548n/a#ifdef EX_UNAVAILABLE
549n/a if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1;
550n/a#endif /* EX_UNAVAILABLE */
551n/a#ifdef EX_SOFTWARE
552n/a if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1;
553n/a#endif /* EX_SOFTWARE */
554n/a#ifdef EX_OSERR
555n/a if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1;
556n/a#endif /* EX_OSERR */
557n/a#ifdef EX_OSFILE
558n/a if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1;
559n/a#endif /* EX_OSFILE */
560n/a#ifdef EX_CANTCREAT
561n/a if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1;
562n/a#endif /* EX_CANTCREAT */
563n/a#ifdef EX_IOERR
564n/a if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1;
565n/a#endif /* EX_IOERR */
566n/a#ifdef EX_TEMPFAIL
567n/a if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1;
568n/a#endif /* EX_TEMPFAIL */
569n/a#ifdef EX_PROTOCOL
570n/a if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1;
571n/a#endif /* EX_PROTOCOL */
572n/a#ifdef EX_NOPERM
573n/a if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1;
574n/a#endif /* EX_NOPERM */
575n/a#ifdef EX_CONFIG
576n/a if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1;
577n/a#endif /* EX_CONFIG */
578n/a#ifdef EX_NOTFOUND
579n/a if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1;
580n/a#endif /* EX_NOTFOUND */
581n/a
582n/a return 0;
583n/a}
584n/a
585n/a
586n/avoid
587n/ainitriscos()
588n/a{
589n/a PyObject *m, *d, *stat_m;
590n/a
591n/a m = Py_InitModule("riscos", riscos_methods);
592n/a
593n/a if (all_ins(m))
594n/a return;
595n/a
596n/a d = PyModule_GetDict(m);
597n/a
598n/a Py_INCREF(PyExc_OSError);
599n/a PyModule_AddObject(m, "error", PyExc_OSError);
600n/a
601n/a PyStructSequence_InitType(&StatResultType, &stat_result_desc);
602n/a PyDict_SetItemString(d, "stat_result", (PyObject*) &StatResultType);
603n/a}