24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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 />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!