You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
392 volume VI os16<br />
Sorgenti della libreria generale 393<br />
«<br />
«<br />
4030019 |}<br />
105.17.28 lib/unistd/read.c<br />
Si veda la sezione 97.29.<br />
4040001 |#include <br />
4040002 |#include <br />
4040003 |#include <br />
4040004 |#include <br />
4040005 |#include <br />
4040006 |//----------------------------------------------------------------------<br />
4040007 |ssize_t<br />
4040008 |read (int fdn, void *buffer, size_t count)<br />
4040009 |{<br />
4040010 | sysmsg_read_t msg;<br />
4040011 | //<br />
4040012 | // Reduce size of read if necessary.<br />
4040013 | //<br />
4040014 | if (count > BUFSIZ)<br />
4040015 | {<br />
4040016 | count = BUFSIZ;<br />
4040017 | }<br />
4040018 | //<br />
4040019 | // Fill the message.<br />
4040020 | //<br />
4040021 | msg.fdn = fdn;<br />
4040022 | msg.count = count;<br />
4040023 | msg.eof = 0;<br />
4040024 | msg.ret = 0;<br />
4040025 | //<br />
4040026 | // Repeat syscall, until something is received or end of file is<br />
4040027 | // reached.<br />
4040028 | //<br />
4040029 | while (1)<br />
4040030 | {<br />
4040031 | sys (SYS_READ, &msg, (sizeof msg));<br />
4040032 | if (msg.ret != 0 || msg.eof)<br />
4040033 | {<br />
4040034 | break;<br />
4040035 | }<br />
4040036 | }<br />
4040037 | //<br />
4040038 | // Before return: be careful with the ‘msg.buffer’ copy, because<br />
4040039 | // it cannot be longer than ‘count’, otherwise, some unexpected<br />
4040040 | // memory will be overwritten!<br />
4040041 | //<br />
4040042 | if (msg.ret < 0)<br />
4040043 | {<br />
4040044 | //<br />
4040045 | // No valid read, no change inside the buffer.<br />
4040046 | //<br />
4040047 | errno = msg.errno;<br />
4040048 | return (msg.ret);<br />
4040049 | }<br />
4040050 | //<br />
4040051 | if (msg.ret > count)<br />
4040052 | {<br />
4040053 | //<br />
4040054 | // A strange value was returned. Considering it a read error.<br />
4040055 | //<br />
4040056 | errset (EIO); // I/O error.<br />
4040057 | return (-1);<br />
4040058 | }<br />
4040059 | //<br />
4040060 | // A valid read: fill the buffer with ‘msg.ret’ bytes.<br />
4040061 | //<br />
4040062 | memcpy (buffer, msg.buffer, msg.ret);<br />
4040063 | //<br />
4040064 | // Return.<br />
4040065 | //<br />
4040066 | return (msg.ret);<br />
4040067 |}<br />
105.17.29 lib/unistd/rmdir.c<br />
Si veda la sezione 97.30.<br />
4050001 |#include <br />
4050002 |#include <br />
4050003 |#include <br />
4050004 |#include <br />
4050005 |#include <br />
4050006 |#include <br />
4050007 |//----------------------------------------------------------------------<br />
4050008 |int<br />
4050009 |rmdir (const char *path)<br />
4050010 |{<br />
4050011 | sysmsg_stat_t msg_stat;<br />
4050012 | sysmsg_unlink_t msg_unlink;<br />
4050013 | //<br />
4050014 | if (path == NULL)<br />
4050015 | {<br />
4050016 | errset (EINVAL);<br />
4050017 | return (-1);<br />
4050018 | }<br />
4050019 | //<br />
4050020 | strncpy (msg_stat.path, path, PATH_MAX);<br />
4050021 | //<br />
4050022 | sys (SYS_STAT, &msg_stat, (sizeof msg_stat));<br />
4050023 | //<br />
4050024 | if (msg_stat.ret != 0)<br />
4050025 | {<br />
4050026 | errno = msg_stat.errno;<br />
4050027 | errln = msg_stat.errln;<br />
4050028 | strncpy (errfn, msg_stat.errfn, PATH_MAX);<br />
4050029 | return (msg_stat.ret);<br />
4050030 | }<br />
4050031 | //<br />
4050032 | if (!S_ISDIR (msg_stat.stat.st_mode))<br />
4050033 | {<br />
4050034 | errset (ENOTDIR); // Not a directory.<br />
4050035 | return (-1);<br />
4050036 | }<br />
4050037 | //<br />
4050038 | strncpy (msg_unlink.path, path, PATH_MAX);<br />
4050039 | //<br />
4050040 | sys (SYS_UNLINK, &msg_unlink, (sizeof msg_unlink));<br />
4050041 | //<br />
4050042 | errno = msg_unlink.errno;<br />
4050043 | errln = msg_unlink.errln;<br />
4050044 | strncpy (errfn, msg_unlink.errfn, PATH_MAX);<br />
4050045 | return (msg_unlink.ret);<br />
4050046 |}<br />
105.17.30 lib/unistd/seteuid.c<br />
Si veda la sezione 97.33.<br />
4060001 |#include <br />
4060002 |#include <br />
4060003 |#include <br />
4060004 |#include <br />
4060005 |#include <br />
4060006 |//----------------------------------------------------------------------<br />
4060007 |int<br />
4060008 |seteuid (uid_t uid)<br />
4060009 |{<br />
4060010 | sysmsg_seteuid_t msg;<br />
4060011 | msg.ret = 0;<br />
4060012 | msg.errno = 0;<br />
4060013 | msg.euid = uid;<br />
4060014 | sys (SYS_SETEUID, &msg, (sizeof msg));<br />
4060015 | errno = msg.errno;<br />
4060016 | errln = msg.errln;<br />
4060017 | strncpy (errfn, msg.errfn, PATH_MAX);<br />
4060018 | return (msg.ret);<br />
4060019 |}<br />
4060020 |<br />
105.17.31 lib/unistd/setpgrp.c<br />
Si veda la sezione 97.32.<br />
4070001 |#include <br />
4070002 |#include <br />
4070003 |#include <br />
4070004 |//----------------------------------------------------------------------<br />
4070005 |int<br />
4070006 |setpgrp (void)<br />
4070007 |{<br />
4070008 | sys (SYS_PGRP, NULL, (size_t) 0);<br />
4070009 | return (0);<br />
4070010 |}<br />
105.17.32 lib/unistd/setuid.c<br />
Si veda la sezione 97.33.<br />
4080001 |#include <br />
4080002 |#include <br />
4080003 |#include <br />
4080004 |#include <br />
4080005 |#include <br />
4080006 |//----------------------------------------------------------------------<br />
4080007 |int<br />
4080008 |setuid (uid_t uid)<br />
4080009 |{<br />
4080010 | sysmsg_setuid_t msg;<br />
4080011 | msg.ret = 0;<br />
4080012 | msg.errno = 0;<br />
4080013 | msg.euid = uid;<br />
4080014 | sys (SYS_SETUID, &msg, (sizeof msg));<br />
4080015 | errno = msg.errno;<br />
4080016 | errln = msg.errln;<br />
4080017 | strncpy (errfn, msg.errfn, PATH_MAX);<br />
4080018 | return (msg.ret);<br />
4080019 |}<br />
105.17.33 lib/unistd/sleep.c<br />
Si veda la sezione 97.35.<br />
4090001 |#include <br />
4090002 |#include <br />
4090003 |#include <br />
4090004 |#include <br />
4090005 |#include <br />
4090006 |//----------------------------------------------------------------------<br />
4090007 |unsigned int<br />
4090008 |sleep (unsigned int seconds)<br />
4090009 |{<br />
4090010 | sysmsg_sleep_t msg;<br />
4090011 | time_t start;<br />
4090012 | time_t end;<br />
4090013 | int slept;<br />
4090014 | //<br />
4090015 | if (seconds == 0)<br />
4090016 | {<br />
4090017 | return (0);<br />
4090018 | }<br />
4090019 | //<br />
4090020 | msg.events = WAKEUP_EVENT_TIMER;<br />
4090021 | msg.seconds = seconds;<br />
4090022 | sys (SYS_SLEEP, &msg, (sizeof msg));<br />
4090023 | start = msg.ret;<br />
4090024 | end = time (NULL);<br />
4090025 | slept = end - msg.ret;<br />
4090026 | //<br />
4090027 | if (slept < 0)<br />
4090028 | {<br />
4090029 | return (seconds);<br />
4090030 | }<br />
4090031 | else if (slept < seconds)<br />
4090032 | {<br />
«<br />
«<br />
«<br />
«