diff --git a/src/tests/add-ons/kernel/file_systems/beserved/BeManager/GroupProperties.d b/src/tests/add-ons/kernel/file_systems/beserved/BeManager/GroupProperties.d deleted file mode 100644 index 1861d3a730..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/BeManager/GroupProperties.d +++ /dev/null @@ -1,32 +0,0 @@ -GroupProperties.o : \ - /boot/home/BeServed/source/BeManager/GroupProperties.cpp \ - /boot/develop/headers/be/app/Application.h \ - /boot/develop/headers/be/storage/Resources.h \ - /boot/develop/headers/be/interface/Window.h \ - /boot/develop/headers/be/interface/View.h \ - /boot/develop/headers/be/interface/Region.h \ - /boot/develop/headers/be/interface/Button.h \ - /boot/develop/headers/be/interface/CheckBox.h \ - /boot/develop/headers/be/interface/TextControl.h \ - /boot/develop/headers/be/interface/Bitmap.h \ - /boot/develop/headers/be/storage/Mime.h \ - /boot/develop/headers/be/storage/FilePanel.h \ - /boot/develop/headers/be/interface/Menu.h \ - /boot/develop/headers/be/interface/PopUpMenu.h \ - /boot/develop/headers/be/interface/MenuItem.h \ - /boot/develop/headers/be/interface/MenuField.h \ - /boot/develop/headers/be/support/String.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/ColumnListView.h \ - /boot/home/dev/Santas\ gift\ bag/Colors.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/CLVColumn.h \ - /boot/home/dev/Santas\ gift\ bag/PrefilledBitmap/PrefilledBitmap.h \ - /boot/home/dev/Santas\ gift\ bag/BetterScrollView/BetterScrollView.h \ - /boot/home/dev/Santas\ gift\ bag/ScrollViewCorner/ScrollViewCorner.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/CLVListItem.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/CLVEasyItem.h \ - /boot/home/dev/Santas\ gift\ bag/NewStrings/NewStrings.h \ - /boot/home/BeServed/source/BeManager/ListControl.h \ - /boot/home/BeServed/source/BeManager/PickUser.h \ - /boot/home/BeServed/source/BeManager/GroupProperties.h \ - /boot/home/BeServed/source/BeManager/Icons.h \ - /boot/home/BeServed/source/BeManager/besure_auth.h diff --git a/src/tests/add-ons/kernel/file_systems/beserved/BeManager/Groups.d b/src/tests/add-ons/kernel/file_systems/beserved/BeManager/Groups.d deleted file mode 100644 index 4bcb0b317a..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/BeManager/Groups.d +++ /dev/null @@ -1,27 +0,0 @@ -Groups.o : /boot/home/BeServed/source/BeManager/Groups.cpp \ - /boot/develop/headers/be/app/Application.h \ - /boot/develop/headers/be/storage/Resources.h \ - /boot/develop/headers/be/interface/Window.h \ - /boot/develop/headers/be/interface/View.h \ - /boot/develop/headers/be/interface/Region.h \ - /boot/develop/headers/be/interface/Alert.h \ - /boot/develop/headers/be/interface/Button.h \ - /boot/develop/headers/be/storage/FindDirectory.h \ - /boot/develop/headers/be/storage/Mime.h \ - /boot/develop/headers/posix/string.h \ - /boot/develop/headers/posix/dirent.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/ColumnListView.h \ - /boot/home/dev/Santas\ gift\ bag/Colors.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/CLVColumn.h \ - /boot/home/dev/Santas\ gift\ bag/PrefilledBitmap/PrefilledBitmap.h \ - /boot/home/dev/Santas\ gift\ bag/BetterScrollView/BetterScrollView.h \ - /boot/home/dev/Santas\ gift\ bag/ScrollViewCorner/ScrollViewCorner.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/CLVListItem.h \ - /boot/home/dev/Santas\ gift\ bag/ColumnListView/CLVEasyItem.h \ - /boot/home/dev/Santas\ gift\ bag/NewStrings/NewStrings.h \ - /boot/home/BeServed/source/BeManager/TreeControl.h \ - /boot/home/BeServed/source/BeManager/ListControl.h \ - /boot/home/BeServed/source/BeManager/Groups.h \ - /boot/home/BeServed/source/BeManager/GroupProperties.h \ - /boot/home/BeServed/source/BeManager/Icons.h \ - /boot/home/BeServed/source/BeManager/besure_auth.h diff --git a/src/tests/add-ons/kernel/file_systems/beserved/FileSharing-Windows/FileSharing.suo b/src/tests/add-ons/kernel/file_systems/beserved/FileSharing-Windows/FileSharing.suo deleted file mode 100644 index a1d2e5f3c9..0000000000 Binary files a/src/tests/add-ons/kernel/file_systems/beserved/FileSharing-Windows/FileSharing.suo and /dev/null differ diff --git a/src/tests/add-ons/kernel/file_systems/beserved/FileSharing-Windows/scanappl.suo b/src/tests/add-ons/kernel/file_systems/beserved/FileSharing-Windows/scanappl.suo deleted file mode 100644 index 82552ec615..0000000000 Binary files a/src/tests/add-ons/kernel/file_systems/beserved/FileSharing-Windows/scanappl.suo and /dev/null differ diff --git a/src/tests/add-ons/kernel/file_systems/beserved/Menus/MenuTesting.cpp b/src/tests/add-ons/kernel/file_systems/beserved/Menus/MenuTesting.cpp deleted file mode 100644 index f43fc8a3ec..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/Menus/MenuTesting.cpp +++ /dev/null @@ -1,206 +0,0 @@ -// File Sharing Preferences Application -// -// FileSharing.cpp -// - -// TODO: -// 1. Make share properties panel modal but still work with file panel - -#include "Application.h" -#include "Window.h" -#include "Alert.h" -#include "CheckBox.h" -#include "Button.h" -#include "TextControl.h" -#include "Menu.h" -#include "MenuBar.h" -#include "PopUpMenu.h" -#include "MenuItem.h" -#include "MenuField.h" -#include "Point.h" -#include "Mime.h" -#include "Roster.h" -#include "Resources.h" - -#define MENU_BAR_HEIGHT 18.0 - -#define MSG_TEST_CANCEL 'TCan' -#define MSG_FILE_NEW 'FNew' -#define MSG_FILE_OPEN 'FOpn' -#define MSG_FILE_SAVE 'FSav' - - -class TestMenuItem : public BMenuItem -{ - public: - TestMenuItem(char *title, BMessage *msg) - : BMenuItem(title, msg) - { - } - - ~TestMenuItem() - { - } - - void DrawContent() - { - Highlight(IsSelected()); - } - - void Highlight(bool flag) - { - rgb_color white = { 255, 255, 255, 255 }; - rgb_color gray = ui_color(B_PANEL_BACKGROUND_COLOR); - rgb_color yellow = ui_color(B_WINDOW_TAB_COLOR); - - BPoint point = ContentLocation(); - BMenu *menu = Menu(); - BRect frame = Frame(); - - if (!flag) - { - frame.right = 18; - menu->SetLowColor(gray); - menu->FillRect(frame, B_SOLID_LOW); - frame = Frame(); - frame.left = 18; - } - else - { -// menu->SetLowColor(darkYellow); -// menu->StrokeRect(frame, B_SOLID_LOW); -// frame.InsetBy(1, 1); - } - - menu->SetLowColor(flag ? yellow : white); - menu->FillRect(frame, B_SOLID_LOW); - menu->MovePenTo(point.x + 7, point.y + 10); - menu->DrawString(Label()); - } -}; - -// ----- TestView --------------------------------------------------------------- - -class TestView : public BView -{ - public: - TestView(BRect rect) - : BView(rect, "TestView", B_FOLLOW_BOTTOM | B_FOLLOW_LEFT_RIGHT, B_WILL_DRAW) - { - rgb_color gray = ui_color(B_PANEL_BACKGROUND_COLOR); - SetViewColor(gray); - - BRect r; - r.Set(337, 52, 412, 72); - AddChild(new BButton(r, "CancelBtn", "Close", new BMessage(MSG_TEST_CANCEL), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM)); - } - - ~TestView() - { - } - - void Draw(BRect rect) - { - BRect r = Bounds(); - rgb_color black = { 0, 0, 0, 255 }; - rgb_color gray = ui_color(B_PANEL_BACKGROUND_COLOR); - - SetViewColor(gray); - SetLowColor(gray); - FillRect(r, B_SOLID_LOW); - - SetHighColor(black); - SetFont(be_plain_font); - SetFontSize(10); - MovePenTo(15, 15); - DrawString(""); - } - - private: - BButton *deployBtn; -}; - -// ----- TestWindow ------------------------------------------------------------------- - -class TestWindow : public BWindow -{ - public: - TestWindow() - : BWindow(BRect(50, 50, 475, 460), "Menu Testing", B_TITLED_WINDOW, 0) - { - BRect r = Bounds(); - - r = Bounds(); - testView = new TestView(r); - AddChild(testView); - - r.bottom = MENU_BAR_HEIGHT; - menuBar = new BMenuBar(r, "MenuBar"); - AddChild(menuBar); - - BMenu *menu = new BMenu("File"); - menuBar->AddItem(menu); - - menu->AddItem(new TestMenuItem("New", new BMessage(MSG_FILE_NEW))); - menu->AddItem(new TestMenuItem("Open", new BMessage(MSG_FILE_OPEN))); - menu->AddItem(new TestMenuItem("Save", new BMessage(MSG_FILE_SAVE))); - - Show(); - } - - // ~TestWindow() - // - ~TestWindow() - { - be_app->PostMessage(B_QUIT_REQUESTED); - } - - // MessageReceived() - // - void MessageReceived(BMessage *msg) - { - switch (msg->what) - { - case MSG_TEST_CANCEL: - Quit(); - break; - - default: - BWindow::MessageReceived(msg); - break; - } - } - - private: - TestView *testView; - BMenuBar *menuBar; -}; - - -// ----- Application ------------------------------------------------------------------------- - -class TestApp : public BApplication -{ - public: - TestApp() - : BApplication("application/x-vnd.Teldar-MenuTesting") - { - win = new TestWindow; - } - - ~TestApp() - { - } - - private: - TestWindow *win; -}; - -// main() -// -int main() -{ - new TestApp; - be_app->Run(); - delete be_app; -} diff --git a/src/tests/add-ons/kernel/file_systems/beserved/Menus/MenuTesting.proj b/src/tests/add-ons/kernel/file_systems/beserved/Menus/MenuTesting.proj deleted file mode 100644 index a5533333b8..0000000000 Binary files a/src/tests/add-ons/kernel/file_systems/beserved/Menus/MenuTesting.proj and /dev/null differ diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/beserved_server.c b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/beserved_server.c deleted file mode 100644 index 0e3fce26e6..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/beserved_server.c +++ /dev/null @@ -1,2678 +0,0 @@ -// btAdd.cpp : Defines the entry point for the console application. -// - -// To-do: -// -// 1.0.67 -// X Auto-mount from My Network -// _ BONE-compliance -// X Better reconnect logic -// X INT and TERM signal handlers -// X Lingering buffer mechanism -// X Test for duplicate share names defined in settings file -// -// 1.0.68 (stability) -// _ Fix problems with share browsing -// _ Fix duplicate vnid problem -// X Fix large file write problem -// X Correct crash during unmount process -// _ Packet buffer allocation/de-allocation cleanup -// _ Query capabilities -// _ Ability to mount multiple shares -// _ Node monitoring -// -// 1.0.69 (security) -// _ Don't allow following links outside the shared folder -// _ Make a file share read-only -// _ Restart of server erases inode-to-filename map -// -// Long-term -// _ Ability to reconnect shares at login -// _ Preferences application for defining file shares -// - -// Potential Uses: -// 1. Domain server, keeping track of users for logging in -// 2. File server, to share BeOS volume files across a network -// 3. Document management, to store documents with attributes -// 4. Version Control System, to manage multiple versions of documents -// 5. General directory server, for local or network settings and information - -#include "FindDirectory.h" - -#include "betalk.h" -#include "fsproto.h" -#include "netdb.h" - -#include "utime.h" -#include "ctype.h" -#include "time.h" -#include "signal.h" - -#define BT_MAX_THREADS 100 -#define BT_MAX_RETRIES 3 -#define BT_MAX_FILE_SHARES 128 - -#define BT_MAIN_NAME "BeServed Daemon" -#define BT_THREAD_NAME "BeServed Handler" -#define BT_HOST_THREAD_NAME "BeServed Host Publisher" -#define BT_SIGNATURE "application/x-vnd.Teldar-BeServed" - -#define PATH_ROOT "/boot" -#define PATH_DELIMITER '/' - -#ifndef iswhite -#define iswhite(c) ((c == ' ' || c == '\t')) -#endif - -typedef struct -{ - unsigned int type; - unsigned int length; - char *data; -} bt_arg_t; - -typedef struct session -{ - int socket; - unsigned int s_addr; - thread_id handlerID; - - // What share did the client connect to? - int share; - - char ioBuffer[BT_MAX_IO_BUFFER + 1]; - char attrBuffer[BT_MAX_ATTR_BUFFER + 1]; - char pathBuffer[B_PATH_NAME_LENGTH]; -} bt_session_t; - -typedef void (*bt_net_func)(bt_session_t *, unsigned int, int, bt_arg_t *); - -typedef struct dirCommand -{ - unsigned char command; - bt_net_func handler; -} bt_command_t; - -typedef struct -{ - vnode_id vnid; - int shareId; - char unused[20]; -} bt_fdesc; - -typedef struct btnode -{ - vnode_id vnid; - char name[100]; - int refCount; - struct btnode *next; - struct btnode *prev; - struct btnode *parent; -} bt_node; - -typedef struct fileShare -{ - char path[B_PATH_NAME_LENGTH]; - char name[B_FILE_NAME_LENGTH]; - bool used; - bool readOnly; - struct fileShare *next; -} bt_fileShare_t; - -bt_node *rootNode = NULL; - - -int main(int argc, char *argv[]); -bool dateCheck(); -int32 btSendHost(void *data); -void startService(); -void endService(int sig); -void initSessions(); -void initShares(); -void getFileShare(const char *buffer); -int receiveRequest(bt_session_t *session); -void handleRequest(bt_session_t *session, unsigned int xid, unsigned char command, int argc, bt_arg_t argv[]); -void launchThread(int client, struct sockaddr_in *addr); -int tooManyConnections(unsigned int s_addr); -void sendErrorToClient(int client, int error); -void printToClient(int client, char *format, ...); -void getArguments(bt_session_t *session, bt_inPacket *packet, unsigned char command); -int32 requestThread(void *data); -int copyFile(char *source, char *dest); -int stricmp(char *str1, char *str2); - -bt_node *btGetNodeFromVnid(vnode_id vnid); -void btAddHandle(bt_fdesc *dhandle, bt_fdesc *fhandle, char *name); -void btRemoveHandle(bt_fdesc *fhandle); -void btPurgeNodes(bt_fdesc *fdesc); -void btRemoveNode(bt_node *deadNode); -bool btIsAncestorNode(vnode_id vnid, bt_node *node); -char *btGetLocalFileName(char *path, bt_fdesc *fhandle); -void btMakeHandleFromNode(bt_node *node, bt_fdesc *fdesc); -bt_node *btFindNode(bt_node *parent, char *fileName); -char *btGetSharePath(char *shareName); -int btGetShareId(char *shareName); -void btGetRootPath(vnode_id vnid, char *path); -void btLock(sem_id semaphore, int32 *atomic); -void btUnlock(sem_id semaphore, int32 *atomic); - -int btMount(char *shareName, btFileHandle *fhandle); -int btGetFSInfo(fs_info *fsInfo); -int btLookup(char *pathBuf, bt_fdesc *ddesc, char *fileName, bt_fdesc *fdesc); -int btStat(char *pathBuf, bt_fdesc *fdesc, struct stat *st); -int btReadDir(char *pathBuf, bt_fdesc *ddesc, DIR **dir, bt_fdesc *fdesc, char *filename, struct stat *st); -int32 btRead(char *pathBuf, bt_fdesc *fdesc, off_t pos, int32 len, char *buffer); -int32 btWrite(char *pathBuf, bt_fdesc *fdesc, off_t pos, int32 len, char *buffer); -int btCreate(char *pathBuf, bt_fdesc *ddesc, char *name, int omode, int perms, bt_fdesc *fdesc); -int btTruncate(char *pathBuf, bt_fdesc *fdesc, int64 len); -int btCreateDir(char *pathBuf, bt_fdesc *ddesc, char *name, int perms, bt_fdesc *fdesc, struct stat *st); -int btDeleteDir(char *pathBuf, bt_fdesc *ddesc, char *name); -int btRename(char *pathBuf, bt_fdesc *oldfdesc, char *oldName, bt_fdesc *newfdesc, char *newName); -int btUnlink(char *pathBuf, bt_fdesc *ddesc, char *name); -int btReadLink(char *pathBuf, bt_fdesc *fdesc, char *buffer, int length); -int btSymLink(char *pathBuf, bt_fdesc *fdesc, char *name, char *dest); -int btWStat(char *pathBuf, bt_fdesc *fdesc, long mask, int32 mode, int32 uid, int32 gid, int64 size, int32 atime, int32 mtime); -int btReadAttrib(char *pathBuf, bt_fdesc *fdesc, char *name, int32 dataType, void *buffer, int32 pos, int32 len); -int btWriteAttrib(char *pathBuf, bt_fdesc *fdesc, char *name, int32 dataType, void *buffer, int32 pos, int32 len); -int btReadAttribDir(char *pathBuf, bt_fdesc *fdesc, DIR **dir, char *attrName); -int btRemoveAttrib(char *pathBuf, bt_fdesc *fdesc, char *name); -int btStatAttrib(char *pathBuf, bt_fdesc *fdesc, char *name, struct attr_info *info); -int btReadIndexDir(DIR **dir, char *indexName); -int btCreateIndex(char *name, int type, int flags); -int btRemoveIndex(char *name); -int btStatIndex(char *name, struct index_info *info); -int btReadQuery(DIR **dir, char *query, char *fileName, int64 *inode); - -void netbtMount(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtFSInfo(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtLookup(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtStat(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtReadDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtRead(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtWrite(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtCreate(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtTruncate(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtCreateDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtDeleteDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtRename(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtUnlink(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtReadLink(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtSymLink(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtWStat(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtReadAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtWriteAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtReadAttribDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtRemoveAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtStatAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtReadIndexDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtCreateIndex(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtRemoveIndex(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtStatIndex(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtReadQuery(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); -void netbtQuit(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]); - -bt_session_t sessions[BT_MAX_THREADS]; -bt_fileShare_t fileShares[BT_MAX_FILE_SHARES]; -bool running = true; -int server; -thread_id hostThread; -sem_id handleSem; -int32 handleVar; - -bt_command_t dirCommands[] = -{ - { BT_CMD_MOUNT, netbtMount }, - { BT_CMD_FSINFO, netbtFSInfo }, - { BT_CMD_LOOKUP, netbtLookup }, - { BT_CMD_STAT, netbtStat }, - { BT_CMD_READDIR, netbtReadDir }, - { BT_CMD_READ, netbtRead }, - { BT_CMD_WRITE, netbtWrite }, - { BT_CMD_CREATE, netbtCreate }, - { BT_CMD_TRUNCATE, netbtTruncate }, - { BT_CMD_MKDIR, netbtCreateDir }, - { BT_CMD_RMDIR, netbtDeleteDir }, - { BT_CMD_RENAME, netbtRename }, - { BT_CMD_UNLINK, netbtUnlink }, - { BT_CMD_READLINK, netbtReadLink }, - { BT_CMD_SYMLINK, netbtSymLink }, - { BT_CMD_WSTAT, netbtWStat }, - { BT_CMD_READATTRIB, netbtReadAttrib }, - { BT_CMD_WRITEATTRIB, netbtWriteAttrib }, - { BT_CMD_READATTRIBDIR, netbtReadAttribDir }, - { BT_CMD_REMOVEATTRIB, netbtRemoveAttrib }, - { BT_CMD_STATATTRIB, netbtStatAttrib }, - { BT_CMD_READINDEXDIR, netbtReadIndexDir }, - { BT_CMD_CREATEINDEX, netbtCreateIndex }, - { BT_CMD_REMOVEINDEX, netbtRemoveIndex }, - { BT_CMD_STATINDEX, netbtStatIndex }, - { BT_CMD_READQUERY, netbtReadQuery }, - { BT_CMD_QUIT, netbtQuit }, - { 0, NULL } -}; - -/*---------------------------------------------------------------- -class BeServedServer : public BApplication -{ - thread_id appThread; - bool running; - - public: - BeServedServer(const char *signature); - - virtual void ReadyToRun(); - virtual bool QuitRequested(); -}; - -BeServedServer::BeServedServer(const char *signature) - : BApplication(signature) -{ -} - -void BeServedServer::ReadyToRun() -{ - running = true; - appThread = spawn_thread(appMain, BT_MAIN_NAME, B_NORMAL_PRIORITY, this); - resume_thread(appThread); -} - -bool BeServedServer::QuitRequested() -{ - status_t result; - - if (!BApplication::QuitRequested()) - return false; - - running = false; - wait_for_thread(appThread, &result); - return true; -} - -int main(int argc, char *argv[]) -{ - BeServedServer app(BT_SIGNATURE); - app.Run(); - return 0; -} -----------------------------------------------------------------------*/ -int main(int argc, char *argv[]) -{ - if (!dateCheck()) - return 0; - - initSessions(); - initShares(); - signal(SIGINT, endService); - signal(SIGTERM, endService); - - if ((handleSem = create_sem(0, "File Handle Semaphore")) > B_OK) - { - hostThread = spawn_thread(btSendHost, BT_HOST_THREAD_NAME, B_NORMAL_PRIORITY, 0); - resume_thread(hostThread); - - // Run the daemon. We will not return until the service is being - // stopped. - startService(); - - if (hostThread > 0) - kill_thread(hostThread); - - if (handleSem > 0) - delete_sem(handleSem); - } - - return 0; -} - -bool dateCheck() -{ - struct stat st; - time_t curTime; - - time(&curTime); - if (curTime > 999491300) - return false; - - if (stat("/boot/home/config/servers/beserved_server", &st) == 0) - if (curTime < st.st_ctime || curTime > st.st_ctime + 5184000) - return false; - - return true; -} - -int32 btSendHost(void *data) -{ - struct sockaddr_in serverAddr, clientAddr; - char buffer[4096]; - int i, server, addrLen, bufLen; - - buffer[0] = 0; - bufLen = sizeof(buffer); - - memset(&serverAddr, 0, sizeof(serverAddr)); - serverAddr.sin_port = htons(BT_QUERYHOST_PORT); - serverAddr.sin_family = AF_INET; - serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); - - server = socket(AF_INET, SOCK_DGRAM, 0); - if (server == INVALID_SOCKET) - return -1; - - // Bind that socket to the address constructed above. - if (bind(server, (struct sockaddr *) &serverAddr, sizeof(serverAddr))) - return -1; - - while (running) - { - addrLen = sizeof(struct sockaddr_in); - recvfrom(server, buffer, bufLen - 1, 0, (struct sockaddr *) &clientAddr, &addrLen); - - if (strcmp(buffer, "btGetHost") == 0) - gethostname(buffer, bufLen); - else if (strcmp(buffer, "btGetShares") == 0) - { - buffer[0] = 0; - for (i = 0; i < BT_MAX_FILE_SHARES; i++) - if (fileShares[i].used) - { - strcat(buffer, fileShares[i].name); - strcat(buffer, "/"); - } - } - else - continue; - - sendto(server, buffer, strlen(buffer), 0, (struct sockaddr *) &clientAddr, addrLen); - } - - // Close the socket. Technically, I believe we should call shutdown() - // first, but the BeOS header file socket.h indicates that this - // function is not currently working. It is present but may not have - // any effect. - shutdown(server, 2); - closesocket(server); - return 0; -} - -void initSessions() -{ - int i; - - for (i = 0; i < BT_MAX_THREADS; i++) - { - sessions[i].socket = INVALID_SOCKET; - sessions[i].handlerID = 0; - } -} - -void initShares() -{ - FILE *fp; - char path[B_PATH_NAME_LENGTH], buffer[512]; - int i, length; - - for (i = 0; i < BT_MAX_FILE_SHARES; i++) - { - fileShares[i].name[0] = 0; - fileShares[i].path[0] = 0; - fileShares[i].used = false; - fileShares[i].readOnly = false; - fileShares[i].next = NULL; - } - - find_directory(B_COMMON_SETTINGS_DIRECTORY, 0, false, path, sizeof(path)); - strcat(path, "/BeServed-Settings"); - - fp = fopen(path, "r"); - if (fp) - { - while (fgets(buffer, sizeof(buffer) - 1, fp)) - { - length = strlen(buffer); - if (length <= 1 || buffer[0] == '#') - continue; - - if (buffer[length - 1] == '\n') - buffer[--length] = 0; - - if (strncmp(buffer, "share ", 6) == 0) - getFileShare(buffer); - } - - fclose(fp); - } -} - -void getFileShare(const char *buffer) -{ - struct stat st; - char path[B_PATH_NAME_LENGTH], share[B_FILE_NAME_LENGTH], *tok, *folder, delimiter; - int i; - - tok = (char *) buffer + (6 * sizeof(char)); - while (*tok && iswhite(*tok)) - tok++; - - if (!*tok) - return; - - if (*tok == '"') - { - delimiter = '"'; - tok++; - } - else - delimiter = ' '; - - i = 0; - while (*tok && *tok != delimiter) - path[i++] = *tok++; - - if (!*tok) - return; - - path[i] = 0; - while (*tok && iswhite(*tok)) - tok++; - - if (!*tok) - return; - - if (strncmp(tok, "as ", 3) != 0) - return; - - tok += 3; - while (*tok && iswhite(*tok)) - tok++; - - if (*tok == '"') - { - delimiter = '"'; - tok++; - } - else - delimiter = ' '; - - i = 0; - while (*tok && (isalnum(*tok) || (*tok == ' ' && delimiter == '"'))) - share[i++] = *tok++; - - if (i == 0) - return; - - // Now verify that the share name specified has not already been - // used to share another path. - share[i] = 0; - folder = btGetSharePath(share); - if (folder) - { - printf("%s already defined as %s\n", share, folder); - return; - } - - // Check the path to ensure its validity. - if (stat(path, &st) != 0) - return; - - for (i = 0; i < BT_MAX_FILE_SHARES; i++) - if (!fileShares[i].used) - { - printf("Defining %s as %s\n", share, path); - strcpy(fileShares[i].name, share); - strcpy(fileShares[i].path, path); - fileShares[i].used = true; - return; - } - - printf("Share %s could not be defined (too many shares)\n", share); -} - -void startService() -{ - struct sockaddr_in serverAddr, clientAddr; - int client, addrLen; - char flags; - - // Store the length of the socket addressing structure for accept(). - addrLen = sizeof(struct sockaddr_in); - - // Initialize the server address structure. - memset(&serverAddr, 0, sizeof(serverAddr)); - serverAddr.sin_port = htons(BT_TCPIP_PORT); - serverAddr.sin_family = AF_INET; - serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); - - // Create a new socket to receive incoming requests. - server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (server == INVALID_SOCKET) - return; - - // Set the socket option to reuse the current address in case it was - // in use by a prior version of the service that has not yet relinquished - // the socket. - flags = 1; - setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &flags, sizeof(flags)); - - // Bind that socket to the address constructed above. - if (bind(server, (struct sockaddr *) &serverAddr, sizeof(serverAddr))) - return; - - // Listen for incoming connections. - if (listen(server, 5)) - return; - - // Continually accept incoming connections. When one is found, - // fire off a handler thread to accept commands. - while (running) - { - client = accept(server, (struct sockaddr *) &clientAddr, &addrLen); - if (client != INVALID_SOCKET) - launchThread(client, &clientAddr); - } - - // Close the socket. Technically, I believe we should call shutdown() - // first, but the BeOS header file socket.h indicates that this - // function is not currently working. It is present but may not have - // any effect. - shutdown(server, 2); - closesocket(server); - server = INVALID_SOCKET; -} - -void endService(int sig) -{ - if (hostThread > 0) - kill_thread(hostThread); - - if (handleSem > 0) - delete_sem(handleSem); - - signal(SIGINT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - exit(0); -} - -// launchThread() -// -void launchThread(int client, struct sockaddr_in *addr) -{ - int i, retry, found; - - // We need to find an available session for this connection. We don't - // want to create threads willy nilly until we bring down the OS, so we - // establish a pool of available sessions (threads) from which we must - // allocate with every request. - found = FALSE; - for (retry = 0; retry < BT_MAX_RETRIES && !found; retry++) - { - for (i = 0; i < BT_MAX_THREADS; i++) - if (sessions[i].socket == INVALID_SOCKET) - { - found = TRUE; - sessions[i].socket = client; - sessions[i].s_addr = addr->sin_addr.s_addr; - sessions[i].handlerID = - spawn_thread(requestThread, BT_THREAD_NAME, B_NORMAL_PRIORITY, &sessions[i]); - resume_thread(sessions[i].handlerID); - break; - } - - if (!found) - snooze(100000); - } - - if (!found) - { - sendErrorToClient(client, EBUSY); - shutdown(client, 2); - closesocket(client); - } -} - -int32 requestThread(void *data) -{ - bt_session_t *session = (bt_session_t *) data; - - if (!session) - return 0; - - while (receiveRequest(session)); - - shutdown(session->socket, 2); - closesocket(session->socket); - session->socket = INVALID_SOCKET; - return 0; -} - -int receiveRequest(bt_session_t *session) -{ - bt_inPacket packet; - char signature[20], *buffer; - unsigned char command; - int client, sigLen; - int32 bytesRead, length; - - client = session->socket; - - // Read the BeTalk RPC header. - sigLen = strlen(BT_RPC_SIGNATURE); - recv(client, signature, sigLen, 0); -// recv(client, &verHi, sizeof(verHi), 0); -// recv(client, &verLo, sizeof(verLo), 0); - - signature[sigLen] = 0; - if (strcmp(signature, BT_RPC_SIGNATURE)) - return 0; - - // Read in the rest of the packet. - recv(client, &length, sizeof(int32), 0); - if (length == 0 || length > BT_RPC_MAX_PACKET_SIZE) - return 0; - - buffer = (char *) malloc(length + 1); - if (!buffer) - return 0; - - bytesRead = 0; - do - { - bytesRead += recv(client, buffer + bytesRead, length - bytesRead, 0); - } while (bytesRead < length); - - buffer[length] = 0; - packet.buffer = buffer; - packet.length = length; - packet.offset = 0; - - // Read the transmission ID and command. - command = btRPCGetChar(&packet); - getArguments(session, &packet, command); - free(buffer); - return (command != BT_CMD_QUIT); -} - -void getArguments(bt_session_t *session, bt_inPacket *packet, unsigned char command) -{ - bt_arg_t args[MAX_COMMAND_ARGS]; - int i, client; - bool error; - unsigned char argc, terminator; - int32 xid; - - error = false; - client = session->socket; - argc = btRPCGetChar(packet); - if (argc > MAX_COMMAND_ARGS) - return; - - for (i = 0; i < argc && !error; i++) - { - args[i].type = btRPCGetInt32(packet); - args[i].data = btRPCGetNewString(packet); - if (args[i].data == NULL) - error = true; - } - - if (!error) - { - xid = btRPCGetInt32(packet); - terminator = btRPCGetChar(packet); - if (terminator == BT_CMD_TERMINATOR) - handleRequest(session, xid, command, argc, args); - } - - while (--i >= 0) - free(args[i].data); -} - -void handleRequest(bt_session_t *session, unsigned int xid, unsigned char command, int argc, bt_arg_t argv[]) -{ - int i; - - for (i = 0; dirCommands[i].handler; i++) - if (command == dirCommands[i].command) - { - (*dirCommands[i].handler)(session, xid, argc, argv); - return; - } - -// sendErrorToClient(sessions[sessionID].socket, E_BAD_COMMAND); -} - -void sendErrorToClient(int client, int error) -{ -// send(client, &error, sizeof(error), 0); -} - -void printToClient(int client, char *format, ...) -{ - va_list args; - char buffer[256]; - - va_start(args, format); - vsprintf(buffer, format, args); - va_end(args); - - send(client, buffer, strlen(buffer), 0); -} - -int copyFile(char *source, char *dest) -{ - FILE *srcFile, *dstFile; - int c; - - srcFile = fopen(source, "rb"); - if (srcFile == NULL) - return EACCES; - - dstFile = fopen(dest, "wb"); - if (dstFile == NULL) - { - fclose(srcFile); - return EACCES; - } - - while ((c = fgetc(srcFile)) != EOF) - fputc(c, dstFile); - - fclose(dstFile); - fclose(srcFile); - return B_OK; -} - -int stricmp(char *str1, char *str2) -{ - char *p1, *p2, c1, c2; - - for (p1 = str1, p2 = str2; *p1; p1++, p2++) - { - if (!*p2) - return 1; - - c1 = toupper(*p1); - c2 = toupper(*p2); - if (c1 < c2) - return -1; - else if (c1 > c2) - return 1; - } - - if (*p2) - return -1; - - return 0; -} - -void btRPCCreateAck(bt_outPacket *packet, unsigned int xid, int error, int length) -{ - packet->size = BT_RPC_MIN_PACKET_SIZE; - packet->buffer = (char *) malloc(packet->size); - packet->length = 0; - - if (!packet->buffer) - return; - - strcpy(packet->buffer, BT_RPC_SIGNATURE); - packet->length += strlen(BT_RPC_SIGNATURE); - btRPCPutInt32(packet, xid); - btRPCPutInt32(packet, 0); - btRPCPutInt32(packet, error); -} - -void btRPCSendAck(int client, bt_outPacket *packet) -{ - int32 bytesSent; - - if (packet) - if (packet->buffer) - { - *(int32 *)(&packet->buffer[9]) = packet->length - 13; - - bytesSent = 0; - do - { - bytesSent += send(client, packet->buffer + bytesSent, packet->length - bytesSent, 0); - } while (bytesSent < packet->length); - - free(packet->buffer); - } -} - -unsigned char btRPCGetChar(bt_inPacket *packet) -{ - unsigned char value; - - if (packet->offset < packet->length) - value = (unsigned char) packet->buffer[packet->offset]; - else - value = 0; - - packet->offset += sizeof(value); - return value; -} - -unsigned int btRPCGetInt32(bt_inPacket *packet) -{ - int32 value; - - if (packet->offset < packet->length) - value = *((int32 *) &packet->buffer[packet->offset]); - else - value = 0; - - packet->offset += sizeof(value); - return value; -} - -int64 btRPCGetInt64(bt_inPacket *packet) -{ - int64 value; - - if (packet->offset < packet->length) - value = *((int64 *) &packet->buffer[packet->offset]); - else - value = 0; - - packet->offset += sizeof(value); - return value; -} - -char *btRPCGetNewString(bt_inPacket *packet) -{ - char *str; - unsigned int bytes; - - if (packet->offset >= packet->length) - return NULL; - - bytes = *((int32 *) &packet->buffer[packet->offset]); - packet->offset += sizeof(bytes); - if (!bytes) - return NULL; - - str = (char *) malloc(bytes + 1); - if (!str) - return NULL; - - memcpy(str, &packet->buffer[packet->offset], bytes); - str[bytes] = 0; - - packet->offset += bytes; - - return str; -} - -int btRPCGetString(bt_inPacket *packet, char *buffer, int length) -{ - unsigned int bytes; - - if (packet->offset >= packet->length) - return ERANGE; - - bytes = *((int32 *) &packet->buffer[packet->offset]); - packet->offset += sizeof(bytes); - if (!bytes) - return ERANGE; - - if (length < bytes) - return ERANGE; - - memcpy(buffer, &packet->buffer[packet->offset], bytes); - packet->offset += bytes; - return bytes; -} - -int btRPCGetHandle(bt_inPacket *packet, btFileHandle *fhandle) -{ - memcpy(fhandle->opaque, &packet->buffer[packet->offset], BT_FILE_HANDLE_SIZE); - packet->offset += BT_FILE_HANDLE_SIZE; - return B_OK; -} - -void btRPCGrowPacket(bt_outPacket *packet, int bytes) -{ - if (packet->length + bytes > packet->size) - { - int growth = ((bytes / BT_RPC_MIN_PACKET_SIZE) + 1) * BT_RPC_MIN_PACKET_SIZE; - packet->buffer = (char *) realloc(packet->buffer, packet->size + growth); - packet->size += growth; - } -} - -void btRPCPutChar(bt_outPacket *packet, char value) -{ - btRPCGrowPacket(packet, sizeof(value)); - packet->buffer[packet->length] = value; - packet->length += sizeof(value); -} - -void btRPCPutInt32(bt_outPacket *packet, int32 value) -{ - btRPCGrowPacket(packet, sizeof(value)); - *(int32 *)(&packet->buffer[packet->length]) = value; - packet->length += sizeof(value); -} - -void btRPCPutInt64(bt_outPacket *packet, int64 value) -{ - btRPCGrowPacket(packet, sizeof(value)); - *(int64 *)(&packet->buffer[packet->length]) = value; - packet->length += sizeof(value); -} - -void btRPCPutString(bt_outPacket *packet, char *buffer, int length) -{ - if (packet && buffer) - { - btRPCGrowPacket(packet, sizeof(length) + length); - btRPCPutInt32(packet, length); - memcpy(&packet->buffer[packet->length], buffer, length); - packet->length += length; - } -} - -void btRPCPutBinary(bt_outPacket *packet, void *buffer, int length) -{ - if (packet && buffer) - { - btRPCGrowPacket(packet, length); - memcpy(&packet->buffer[packet->length], buffer, length); - packet->length += length; - } -} - -void btRPCPutHandle(bt_outPacket *packet, btFileHandle *fhandle) -{ - if (packet && fhandle) - { - btRPCGrowPacket(packet, BT_FILE_HANDLE_SIZE); - memcpy(&packet->buffer[packet->length], fhandle->opaque, BT_FILE_HANDLE_SIZE); - packet->length += BT_FILE_HANDLE_SIZE; - } -} - -int btRPCGetStat(bt_inPacket *packet, struct stat *st) -{ - st->st_dev = 0; - st->st_nlink = btRPCGetInt32(packet); - st->st_uid = btRPCGetInt32(packet); - st->st_gid = btRPCGetInt32(packet); - st->st_size = btRPCGetInt64(packet); - st->st_blksize = btRPCGetInt32(packet); - st->st_rdev = btRPCGetInt32(packet); - st->st_ino = btRPCGetInt64(packet); - st->st_mode = btRPCGetInt32(packet); - st->st_atime = btRPCGetInt32(packet); - st->st_mtime = btRPCGetInt32(packet); - st->st_ctime = btRPCGetInt32(packet); -} - -void btRPCPutStat(bt_outPacket *packet, struct stat *st) -{ - if (packet && st) - { - btRPCPutInt32(packet, (int) st->st_nlink); - btRPCPutInt32(packet, (int) st->st_uid); - btRPCPutInt32(packet, (int) st->st_gid); - btRPCPutInt64(packet, (int64) st->st_size); - btRPCPutInt32(packet, (int) st->st_blksize); - btRPCPutInt32(packet, (int) st->st_rdev); - btRPCPutInt64(packet, (int64) st->st_ino); - btRPCPutInt32(packet, (int) st->st_mode); - btRPCPutInt32(packet, (int) st->st_atime); - btRPCPutInt32(packet, (int) st->st_mtime); - btRPCPutInt32(packet, (int) st->st_ctime); - } -} - -//////////////////////////////////////////////////////////////////// - -bt_node *btGetNodeFromVnid(vnode_id vnid) -{ - bt_node *curNode = rootNode; - - while (curNode) - { - if (curNode->vnid == vnid) - break; - - curNode = curNode->next; - } - - return curNode; -} - -// btAddHandle() -// -void btAddHandle(bt_fdesc *dhandle, bt_fdesc *fhandle, char *name) -{ - bt_node *curNode, *lastNode; - - // We don't store the references to the current and the parent directory. - if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) - return; - - btLock(handleSem, &handleVar); - - // Move to the last node in the list. - curNode = lastNode = rootNode; - while (curNode) - { - lastNode = curNode; - curNode = curNode->next; - } - - // Allocate a new node. - curNode = (bt_node *) malloc(sizeof(bt_node)); - if (curNode == NULL) - { - btUnlock(handleSem, &handleVar); - return; - } - - // Copy over the name, vnid, and parent node. Obtaining the parent - // node requires scanning the list. - strcpy(curNode->name, name); - curNode->prev = lastNode; - curNode->next = NULL; - curNode->refCount = 0; - curNode->vnid = fhandle->vnid; - - // If we weren't provided with the directory node, then this must be - // the root node we're adding. - if (dhandle) - curNode->parent = btGetNodeFromVnid(dhandle->vnid); - else - curNode->parent = NULL; - - // If we didn't have a last node in the list, that means we're - // creating the first (or root) node. The global root node pointer - // needs to be updated accordingly. Otherwise, we just tack this - // item on to the end of the list. - if (lastNode == NULL) - rootNode = curNode; - else - lastNode->next = curNode; - - btUnlock(handleSem, &handleVar); -} - -// btRemoveHandle() -// -void btRemoveHandle(bt_fdesc *fhandle) -{ - bt_node *deadNode; - - btLock(handleSem, &handleVar); - - // Obtain the node in question. If no such node exists, then we - // probably have a bad handle. - deadNode = btGetNodeFromVnid(fhandle->vnid); - btRemoveNode(deadNode); - - btUnlock(handleSem, &handleVar); -} - -// btRemoveNode() -// -void btRemoveNode(bt_node *deadNode) -{ - if (deadNode) - { - // Make this entry's predecessor point to its successor. - if (deadNode->prev) - deadNode->prev->next = deadNode->next; - - // Make this entry's successor point to its predecessor. - if (deadNode->next) - deadNode->next->prev = deadNode->prev; - - // Now deallocate this node. - free(deadNode); - } -} - -// btPurgeNodes() -// -void btPurgeNodes(bt_fdesc *fdesc) -{ - bt_node *curNode; - vnode_id targetVnid; - - targetVnid = fdesc->vnid; - - btLock(handleSem, &handleVar); - - curNode = rootNode; - while (curNode) - { - if (curNode->vnid == targetVnid || btIsAncestorNode(targetVnid, curNode)) - btRemoveNode(curNode); - - curNode = curNode->next; - } - - btUnlock(handleSem, &handleVar); -} - -// btIsAncestorNode() -// -bool btIsAncestorNode(vnode_id vnid, bt_node *node) -{ - bt_node *curNode = node->parent; - - while (curNode) - { - if (curNode->vnid == vnid) - return true; - - curNode = curNode->parent; - } - - return false; -} - -// btGetLocalFileName() -// -char *btGetLocalFileName(char *path, bt_fdesc *fhandle) -{ - bt_node *node, *nodeStack[100]; - int stackSize; - - path[0] = 0; - stackSize = 1; - - btLock(handleSem, &handleVar); - - node = btGetNodeFromVnid(fhandle->vnid); - if (node == NULL) - { - btUnlock(handleSem, &handleVar); - return NULL; - } - - nodeStack[0] = node; - while ((node = node->parent) != NULL) - nodeStack[stackSize++] = node; - - btUnlock(handleSem, &handleVar); - - while (--stackSize >= 0) - { - strcat(path, nodeStack[stackSize]->name); - if (stackSize) - strcat(path, "/"); - } - - return path; -} - -void btMakeHandleFromNode(bt_node *node, bt_fdesc *fdesc) -{ - if (node && fdesc) - fdesc->vnid = node->vnid; -} - -bt_node *btFindNode(bt_node *parent, char *fileName) -{ - bt_node *node; - - btLock(handleSem, &handleVar); - - node = rootNode; - while (node) - { - if (node->parent == parent) - if (strcmp(node->name, fileName) == 0) - break; - - node = node->next; - } - - btUnlock(handleSem, &handleVar); - return node; -} - -char *btGetSharePath(char *shareName) -{ - int i; - - for (i = 0; i < BT_MAX_FILE_SHARES; i++) - if (fileShares[i].used) - if (stricmp(fileShares[i].name, shareName) == 0) - return fileShares[i].path; - - return NULL; -} - -int btGetShareId(char *shareName) -{ - int i; - - for (i = 0; i < BT_MAX_FILE_SHARES; i++) - if (fileShares[i].used) - if (stricmp(fileShares[i].name, shareName) == 0) - return i; - - return -1; -} - -// btGetRootPath() -// -void btGetRootPath(vnode_id vnid, char *path) -{ - bt_node *curNode; - - btLock(handleSem, &handleVar); - - curNode = btGetNodeFromVnid(vnid); - while (curNode && curNode->parent) - curNode = curNode->parent; - - if (curNode) - strcpy(path, curNode->name); - else - path[0] = 0; - - btUnlock(handleSem, &handleVar); -} - -void btLock(sem_id semaphore, int32 *atomic) -{ - int32 previous = atomic_add(atomic, 1); - if (previous >= 1) - while (acquire_sem(semaphore) == B_INTERRUPTED); -} - -void btUnlock(sem_id semaphore, int32 *atomic) -{ - int32 previous = atomic_add(atomic, -1); - if (previous > 1) - release_sem(semaphore); -} - -//////////////////////////////////////////////////////////////////// -/* -void btNotifyListeners(char *shareName) -{ - struct sockaddr_in toAddr, fromAddr; - int i; - - for (i = 0; i < BT_MAX_THREADS; i++) - if (stricmp(sessions[i].share, shareName) == 0) - { - memset(&toAddr, 0, sizeof(toAddr)); - toAddr.sin_port = htons(BT_NODE_MONITOR_PORT); - toAddr.sin_family = AF_INET; - toAddr.sin_addr.s_addr = sessions[i].s_addr; - - sendto(sock, packet, sizeof(packet), 0, &fromAddr, sizeof(fromAddr)); - } -} -*/ -//////////////////////////////////////////////////////////////////// - -int btMount(char *shareName, btFileHandle *fhandle) -{ - struct stat st; - bt_fdesc *fdesc; - char *path; - - path = btGetSharePath(shareName); - if (!path) - return ENOENT; - - if (stat(path, &st) != 0) - return ENOENT; - - if (!S_ISDIR(st.st_mode)) - return EACCES; - - fdesc = (bt_fdesc *) fhandle; - fdesc->vnid = st.st_ino; - fdesc->shareId = btGetShareId(shareName); - - btAddHandle(NULL, fdesc, path); - return B_OK; -} - -int btGetFSInfo(fs_info *fsInfo) -{ - dev_t device = dev_for_path(rootNode->name); - if (device < 0) - return device; - - if (fs_stat_dev(device, fsInfo) != 0) - return errno; - - return B_OK; -} - -int btLookup(char *pathBuf, bt_fdesc *ddesc, char *fileName, bt_fdesc *fdesc) -{ - bt_node *dnode, *fnode; - struct stat st; - char path[B_PATH_NAME_LENGTH], *folder; - - fdesc->vnid = 0; - - btLock(handleSem, &handleVar); - dnode = btGetNodeFromVnid(ddesc->vnid); - btUnlock(handleSem, &handleVar); - - if (!dnode) - return EACCES; - - // Search all nodes for one with the given parent vnid and file - // name. If one is found, we can simply use that node to fill in - // the new handle. - fnode = btFindNode(dnode, fileName); - if (fnode) - { -// btMakeHandleFromNode(fnode, fdesc); - fdesc->vnid = fnode->vnid; - - folder = btGetLocalFileName(pathBuf, fdesc); - if (folder) - if (stat(folder, &st) != 0) - { - btRemoveHandle(fdesc); - fdesc->vnid = 0; - return ENOENT; - } - } - else - { - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - { - sprintf(path, "%s/%s", folder, fileName); - if (stat(path, &st) != 0) - return ENOENT; - - fdesc->vnid = st.st_ino; - btAddHandle(ddesc, fdesc, fileName); - } - } - - return B_OK; -} - -int btStat(char *pathBuf, bt_fdesc *fdesc, struct stat *st) -{ - char *fileName; - int error; - - fileName = btGetLocalFileName(pathBuf, fdesc); - if (fileName) - { - error = stat(fileName, st); - return (error != 0 ? ENOENT : B_OK); - } - - return ENOENT; -} - -int btReadDir(char *pathBuf, bt_fdesc *ddesc, DIR **dir, bt_fdesc *fdesc, char *filename, struct stat *st) -{ - struct dirent *dirInfo; - char *folder, path[B_PATH_NAME_LENGTH]; - - if (!ddesc || !fdesc || !filename) - return EINVAL; - - if (!*dir) - { - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - *dir = opendir(folder); - } - - if (*dir) - if ((dirInfo = readdir(*dir)) != NULL) - { - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - { - sprintf(path, "%s/%s", folder, dirInfo->d_name); - if (stat(path, st) != 0) - return ENOENT; - - strcpy(filename, dirInfo->d_name); - fdesc->vnid = st->st_ino; - btAddHandle(ddesc, fdesc, filename); - return B_OK; - } - } - else - { - closedir(*dir); - return ENOENT; - } - - return EINVAL; -} - -int32 btRead(char *pathBuf, bt_fdesc *fdesc, off_t pos, int32 len, char *buffer) -{ - char *path; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - FILE *fp = fopen(path, "rb"); - if (fp) - { - fseek(fp, pos, SEEK_SET); - len = fread(buffer, 1, len, fp); - fclose(fp); - - buffer[len] = 0; - return len; - } - } - - return 0; -} - -int32 btWrite(char *pathBuf, bt_fdesc *fdesc, off_t pos, int32 len, char *buffer) -{ - char *path; - int32 bytes; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - int file; - file = open(path, O_WRONLY | O_CREAT); - if (file >= 0) - { - lseek(file, pos, SEEK_SET); - bytes = write(file, buffer, len); - close(file); - return bytes; - } - } - - return 0; -} - -int btCreate(char *pathBuf, bt_fdesc *ddesc, char *name, int omode, int perms, bt_fdesc *fdesc) -{ - struct stat st; - char path[B_PATH_NAME_LENGTH], *folder; - int fh; - - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - { - sprintf(path, "%s/%s", folder, name); - fh = open(path, O_RDWR | O_CREAT | omode); - if (fh == -1) - return errno; - else - { - close(fh); - chmod(path, perms); - if (stat(path, &st) == 0) - { - fdesc->vnid = st.st_ino; - btAddHandle(ddesc, fdesc, name); - } - else - return EACCES; - } - } - - return B_OK; -} - -int btTruncate(char *pathBuf, bt_fdesc *fdesc, int64 len) -{ - char *path; - int error; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - error = truncate(path, len); - if (error == -1) - error = errno; - - return error; - } - - return EACCES; -} - -// btCreateDir() -// -int btCreateDir(char *pathBuf, bt_fdesc *ddesc, char *name, int perms, bt_fdesc *fdesc, struct stat *st) -{ - char path[B_PATH_NAME_LENGTH], *folder; - - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - { - sprintf(path, "%s/%s", folder, name); - if (mkdir(path, perms) == -1) - return errno; - - if (stat(path, st) != 0) - return errno; - - fdesc->vnid = st->st_ino; - btAddHandle(ddesc, fdesc, name); - return B_OK; - } - - return ENOENT; -} - -// btDeleteDir() -// -int btDeleteDir(char *pathBuf, bt_fdesc *ddesc, char *name) -{ - bt_fdesc fdesc; - struct stat st; - char path[B_PATH_NAME_LENGTH], *folder; - - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - { - sprintf(path, "%s/%s", folder, name); - if (stat(path, &st) != 0) - return errno; - - if (rmdir(path) == -1) - return errno; - - fdesc.vnid = st.st_ino; - btPurgeNodes(&fdesc); - return B_OK; - } - - return ENOENT; -} - -// btRename() -// -int btRename(char *pathBuf, bt_fdesc *oldfdesc, char *oldName, bt_fdesc *newfdesc, char *newName) -{ - bt_fdesc fdesc; - struct stat st; - char oldPath[B_PATH_NAME_LENGTH], newPath[B_PATH_NAME_LENGTH], *oldFolder, *newFolder; - - oldFolder = btGetLocalFileName(pathBuf, oldfdesc); - if (oldFolder) - { - sprintf(oldPath, "%s/%s", oldFolder, oldName); - - newFolder = btGetLocalFileName(pathBuf, newfdesc); - if (newFolder) - { - sprintf(newPath, "%s/%s", newFolder, newName); - - if (stat(oldPath, &st) != 0) - return errno; - - fdesc.vnid = st.st_ino; - btPurgeNodes(&fdesc); - - if (rename(oldPath, newPath) == -1) - return errno; - - return B_OK; - } - } - - return ENOENT; -} - -// btUnlink() -// -int btUnlink(char *pathBuf, bt_fdesc *ddesc, char *name) -{ - bt_fdesc fdesc; - struct stat st; - char path[B_PATH_NAME_LENGTH], *folder; - int error; - - folder = btGetLocalFileName(pathBuf, ddesc); - if (folder) - { - sprintf(path, "%s/%s", folder, name); - - // Obtain the inode (vnid) of the specified file through stat(). - if (stat(path, &st) != 0) - return errno; - - // Construct a dummy file descriptor and cause it to be removed from - // the list. - fdesc.vnid = st.st_ino; - btRemoveHandle(&fdesc); - - error = unlink(path); - return (error == -1 ? errno : B_OK); - } - - return EACCES; -} - -int btReadLink(char *pathBuf, bt_fdesc *fdesc, char *buffer, int length) -{ - char *path; - int error; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - error = readlink(path, buffer, length); - if (error == -1) - return errno; - - return B_OK; - } - - return ENOENT; -} - -int btSymLink(char *pathBuf, bt_fdesc *fdesc, char *name, char *dest) -{ - char path[B_PATH_NAME_LENGTH], *folder; - - folder = btGetLocalFileName(pathBuf, fdesc); - if (folder) - { - sprintf(path, "%s/%s", folder, name); - if (symlink(dest, path) == -1) - return errno; - - return B_OK; - } - - return ENOENT; -} - -int btWStat(char *pathBuf, bt_fdesc *fdesc, long mask, int32 mode, int32 uid, int32 gid, int64 size, int32 atime, int32 mtime) -{ - struct utimbuf ftimes; - struct stat st; - char *path; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - if (mask & WSTAT_MODE) - chmod(path, mode); - - if (mask & WSTAT_UID) - chown(path, uid, -1); - - if (mask & WSTAT_GID) - chown(path, -1, gid); - - if (mask & WSTAT_SIZE) - truncate(path, size); - - if (stat(path, &st) == 0) - if (mask & WSTAT_ATIME || mask & WSTAT_MTIME) - { - ftimes.actime = mask & WSTAT_ATIME ? atime : st.st_atime; - ftimes.modtime = mask & WSTAT_MTIME ? mtime : st.st_mtime; - utime(path, &ftimes); - } - - return B_OK; - } - - return ENOENT; -} - -int btReadAttrib(char *pathBuf, bt_fdesc *fdesc, char *name, int32 dataType, void *buffer, int32 pos, int32 len) -{ - char *path; - int file; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - file = open(path, O_RDONLY); - - if (file) - { - int bytes = (int) fs_read_attr(file, name, dataType, pos, buffer, len); - close(file); - - if (dataType == B_STRING_TYPE && bytes < len && bytes >= 0) - ((char *) buffer)[bytes] = 0; - - return bytes; - } - } - - return ENOENT; -} - -int btWriteAttrib(char *pathBuf, bt_fdesc *fdesc, char *name, int32 dataType, void *buffer, int32 pos, int32 len) -{ - char *path; - int file; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - file = open(path, O_RDONLY); - - if (file) - { - int bytes = (int) fs_write_attr(file, name, dataType, pos, buffer, len); - close(file); - return bytes; - } - } - - return ENOENT; -} - -int btReadAttribDir(char *pathBuf, bt_fdesc *fdesc, DIR **dir, char *attrName) -{ - dirent_t *entry; - char *path; - - if (!fdesc || !attrName) - return EINVAL; - - if (!*dir) - { - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - *dir = fs_open_attr_dir(path); - } - - if (*dir) - do - { - entry = fs_read_attr_dir(*dir); - if (entry) - { - if (strncmp(entry->d_name, "_trk/", 5) == 0) - continue; - - strcpy(attrName, entry->d_name); - return B_OK; - } - } while (entry); - - if (*dir) - fs_close_attr_dir(*dir); - - return ENOENT; -} - -int btRemoveAttrib(char *pathBuf, bt_fdesc *fdesc, char *name) -{ - char *path; - int file; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - file = open(path, O_RDONLY); - - if (file) - { - int error = fs_remove_attr(file, name); - if (error == -1) - error = errno; - - close(file); - return error; - } - } - - return ENOENT; -} - -int btStatAttrib(char *pathBuf, bt_fdesc *fdesc, char *name, struct attr_info *info) -{ - char *path; - int file; - - path = btGetLocalFileName(pathBuf, fdesc); - if (path) - { - file = open(path, O_RDONLY); - - if (file) - { - int error = fs_stat_attr(file, name, info); - if (error == -1) - error = errno; - - close(file); - return error; - } - } - - return ENOENT; -} - -int btReadIndexDir(DIR **dir, char *indexName) -{ - struct dirent *dirInfo; - - if (!*dir) - { - dev_t device = dev_for_path(rootNode->name); - if (device < 0) - return device; - - *dir = fs_open_index_dir(device); - } - - if (*dir) - if ((dirInfo = fs_read_index_dir(*dir)) != NULL) - { - strcpy(indexName, dirInfo->d_name); - return B_OK; - } - else - { - fs_close_index_dir(*dir); - *dir = NULL; - return ENOENT; - } - - return ENOENT; -} - -int btCreateIndex(char *name, int type, int flags) -{ - dev_t device = dev_for_path(rootNode->name); - if (device < 0) - return device; - - if (fs_create_index(device, name, type, flags) == -1) - return errno; - - return B_OK; -} - -int btRemoveIndex(char *name) -{ - dev_t device = dev_for_path(rootNode->name); - if (device < 0) - return device; - - if (fs_remove_index(device, name) == -1) - return errno; - - return B_OK; -} - -int btStatIndex(char *name, struct index_info *info) -{ - dev_t device = dev_for_path(rootNode->name); - if (device < 0) - return device; - - if (fs_stat_index(device, name, info) == -1) - return errno; - - return B_OK; -} - -int btReadQuery(DIR **dir, char *query, char *fileName, int64 *inode) -{ - struct dirent *dirInfo; - - if (!*dir) - { - dev_t device = dev_for_path(rootNode->name); - if (device < 0) - return device; - - printf("Querying: %s\n", query); - *dir = fs_open_query(device, query, 0); - } - - if (*dir) - if ((dirInfo = fs_read_query(*dir)) != NULL) - { - *inode = dirInfo->d_ino; - strcpy(fileName, dirInfo->d_name); - printf("Query matched %s\n", fileName); - return B_OK; - } - else - { - fs_close_query(*dir); - *dir = NULL; - return ENOENT; - } - - return ENOENT; -} - -//////////////////////////////////////////////////////////////////// - -void netbtMount(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - btFileHandle rootNode; - int client, error; - - client = session->socket; - if (argc == 1) - { - if (argv[0].type == B_STRING_TYPE) - { - char *shareName = argv[0].data; - error = btMount(shareName, &rootNode); - if (error == B_OK) - { - strcpy(session->share, shareName); - - btRPCCreateAck(&packet, xid, error, BT_FILE_HANDLE_SIZE); - btRPCPutHandle(&packet, &rootNode); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } - } - -// sendErrorToClient(client, EINVAL); -} - -void netbtFSInfo(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 1) - { - if (argv[0].type == B_STRING_TYPE) - { - fs_info info; - - error = btGetFSInfo(&info); - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, error, 12); - btRPCPutInt32(&packet, info.block_size); - btRPCPutInt32(&packet, info.total_blocks); - btRPCPutInt32(&packet, info.free_blocks); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } - } - -// sendErrorToClient(client, EINVAL); -} - -void netbtLookup(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - struct stat st; - int client, error; - - client = session->socket; - if (argc == 2) - { - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - bt_fdesc fdesc; - error = btLookup(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, &fdesc); - if (error == B_OK) - error = btStat(session->pathBuffer, &fdesc, &st); - - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, BT_FILE_HANDLE_SIZE + 52); - btRPCPutHandle(&packet, (btFileHandle *) &fdesc); - btRPCPutStat(&packet, &st); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } - } - -// sendErrorToClient(client, EINVAL); -} - -void netbtReadDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - struct stat st; - int client, error; - - client = session->socket; - if (argc == 2) - { - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - bt_fdesc fdesc; - DIR *dir; - char filename[B_PATH_NAME_LENGTH]; - int entries = 0; - - dir = (DIR *)(*((int32 *) argv[1].data)); - error = btReadDir(session->pathBuffer, (bt_fdesc *) argv[0].data, &dir, &fdesc, filename, &st); - - if (error != B_OK) - { - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } - - btRPCCreateAck(&packet, xid, B_OK, 0); - while (error == B_OK) - { - btRPCPutInt64(&packet, fdesc.vnid); - btRPCPutString(&packet, filename, strlen(filename)); - btRPCPutInt32(&packet, (int32) dir); - btRPCPutHandle(&packet, (btFileHandle *) &fdesc); - btRPCPutStat(&packet, &st); - - if (++entries >= 32) - break; - - error = btReadDir(session->pathBuffer, (bt_fdesc *) argv[0].data, &dir, &fdesc, filename, &st); - btRPCPutInt32(&packet, error); - } - - // If we exhausted the list of directory entries without filling - // the buffer, add an error message that will prevent the client - // from requesting further entries. - if (entries < 32) - btRPCPutInt32(&packet, ENOENT); - - btRPCSendAck(client, &packet); - return; - } - } - -// sendErrorToClient(client, EINVAL); -} - -void netbtStat(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 1) - if (argv[0].type == B_STRING_TYPE) - { - struct stat info; - - error = btStat(session->pathBuffer, (bt_fdesc *) argv[0].data, &info); - - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, error, 52); - btRPCPutStat(&packet, &info); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } - -// sendErrorToClient(client, EINVAL); -} - -void netbtRead(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client; - - client = session->socket; - if (argc == 3) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_INT32_TYPE && argv[2].type == B_INT32_TYPE) - { - off_t pos = *((off_t *) argv[1].data); - int32 len = *((int32 *) argv[2].data); - int32 bytes = 0; - - session->ioBuffer[len] = 0; - bytes = btRead(session->pathBuffer, (bt_fdesc *) argv[0].data, pos, len, session->ioBuffer); - - btRPCCreateAck(&packet, xid, B_OK, bytes + 4); - btRPCPutString(&packet, session->ioBuffer, bytes); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtWrite(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client; - - client = session->socket; - if (argc == 4) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_INT64_TYPE && argv[2].type == B_INT32_TYPE && argv[3].type == B_STRING_TYPE) - { - off_t pos = *((off_t *) argv[1].data); - int32 len = *((int32 *) argv[2].data); - int32 bytes; - - bytes = btWrite(session->pathBuffer, (bt_fdesc *) argv[0].data, pos, len, argv[3].data); - if (bytes == len) - { - btRPCCreateAck(&packet, xid, B_OK, 4); - btRPCPutInt32(&packet, bytes); - } - else - btRPCCreateAck(&packet, xid, EACCES, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtCreate(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - struct stat st; - int client, error; - - client = session->socket; - if (argc == 4) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE && argv[2].type == B_INT32_TYPE && argv[3].type == B_INT32_TYPE) - { - bt_fdesc fdesc; - int omode = *((int *) argv[2].data); - int perms = *((int *) argv[3].data); - - error = btCreate(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, omode, perms, &fdesc); - if (error == B_OK) - error = btStat(session->pathBuffer, &fdesc, &st); - - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, 0); - btRPCPutHandle(&packet, (btFileHandle *) &fdesc); - btRPCPutStat(&packet, &st); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtTruncate(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_INT64_TYPE) - { - error = btTruncate(session->pathBuffer, (bt_fdesc *) argv[0].data, *((int64 *) argv[1].data)); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtUnlink(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - error = btUnlink(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtRename(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 4) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE && argv[2].type == B_STRING_TYPE && argv[3].type == B_STRING_TYPE) - { - error = btRename(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, (bt_fdesc *) argv[2].data, argv[3].data); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtCreateDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 3) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE && argv[2].type == B_INT32_TYPE) - { - bt_fdesc fdesc; - struct stat st; - - error = btCreateDir(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, *((int *) argv[2].data), &fdesc, &st); - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, BT_FILE_HANDLE_SIZE + 52); - btRPCPutHandle(&packet, (btFileHandle *) &fdesc); - btRPCPutStat(&packet, &st); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtDeleteDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - error = btDeleteDir(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtReadLink(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 1) - if (argv[0].type == B_STRING_TYPE) - { - char path[B_PATH_NAME_LENGTH]; - error = btReadLink(session->pathBuffer, (bt_fdesc *) argv[0].data, path, B_PATH_NAME_LENGTH); - if (error == B_OK) - { - int length = strlen(path); - btRPCCreateAck(&packet, xid, B_OK, length); - btRPCPutString(&packet, path, length); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - } -} - -void netbtSymLink(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 3) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE && argv[2].type == B_STRING_TYPE) - { - error = btSymLink(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, argv[2].data); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - } -} - -void netbtWStat(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 8) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_INT32_TYPE && argv[2].type == B_INT32_TYPE && - argv[3].type == B_INT32_TYPE && argv[4].type == B_INT32_TYPE && argv[5].type == B_INT32_TYPE && - argv[6].type == B_INT32_TYPE && argv[7].type == B_INT32_TYPE) - { - int32 mask = *((int32 *) argv[1].data); - int32 mode = *((int32 *) argv[2].data); - int32 uid = *((int32 *) argv[3].data); - int32 gid = *((int32 *) argv[4].data); - int64 size = (int64) *((int32 *) argv[5].data); - int32 atime = *((int32 *) argv[6].data); - int32 mtime = *((int32 *) argv[7].data); - - error = btWStat(session->pathBuffer, (bt_fdesc *) argv[0].data, mask, mode, uid, gid, size, atime, mtime); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - } -} - -void netbtReadAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, bytesRead; - - client = session->socket; - if (argc == 5) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE && argv[2].type == B_INT32_TYPE && - argv[3].type == B_INT32_TYPE && argv[4].type == B_INT32_TYPE) - { - char *buffer; - int32 type = *((int32 *) argv[2].data); - int32 pos = *((int32 *) argv[3].data); - int32 len = *((int32 *) argv[4].data); - - if (len <= BT_MAX_ATTR_BUFFER) - buffer = session->attrBuffer; - else - buffer = (char *) malloc(len + 1); - - if (buffer) - { - bytesRead = btReadAttrib(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, type, buffer, pos, len); - if (bytesRead >= 0) - { - btRPCCreateAck(&packet, xid, B_OK, bytesRead + 8); - btRPCPutInt32(&packet, (int32) bytesRead); - if (bytesRead > 0) - btRPCPutString(&packet, buffer, bytesRead); - } - else - btRPCCreateAck(&packet, xid, B_ENTRY_NOT_FOUND, 0); - - if (len > BT_MAX_ATTR_BUFFER) - free(buffer); - } - else - btRPCCreateAck(&packet, xid, ENOMEM, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtWriteAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, bytesWritten; - - client = session->socket; - if (argc == 6) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE && argv[2].type == B_INT32_TYPE && - argv[3].type == B_STRING_TYPE && argv[4].type == B_INT32_TYPE && argv[5].type == B_INT32_TYPE) - { - int32 type = *((int32 *) argv[2].data); - int32 pos = *((int32 *) argv[4].data); - int32 len = *((int32 *) argv[5].data); - - bytesWritten = btWriteAttrib(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, type, argv[3].data, pos, len); - if (bytesWritten >= 0) - { - btRPCCreateAck(&packet, xid, B_OK, 4); - btRPCPutInt32(&packet, (int32) bytesWritten); - } - else - btRPCCreateAck(&packet, xid, B_ENTRY_NOT_FOUND, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtReadAttribDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - { - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - DIR *dir; - char attrName[100]; - int entries = 0; - - dir = (DIR *)(*((int32 *) argv[1].data)); - error = btReadAttribDir(session->pathBuffer, (bt_fdesc *) argv[0].data, &dir, attrName); - - if (error != B_OK) - { - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } - - btRPCCreateAck(&packet, xid, B_OK, 0); - while (error == B_OK) - { - btRPCPutString(&packet, attrName, strlen(attrName)); - btRPCPutInt32(&packet, (int32) dir); - - if (++entries >= 32) - break; - - error = btReadAttribDir(session->pathBuffer, (bt_fdesc *) argv[0].data, &dir, attrName); - btRPCPutInt32(&packet, error); - } - - if (entries < 32) - btRPCPutInt32(&packet, ENOENT); - - btRPCSendAck(client, &packet); - return; - } - } - -// sendErrorToClient(client, EINVAL); -} - -void netbtRemoveAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - error = btRemoveAttrib(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtStatAttrib(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - struct attr_info info; - - error = btStatAttrib(session->pathBuffer, (bt_fdesc *) argv[0].data, argv[1].data, &info); - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, 12); - btRPCPutInt32(&packet, info.type); - btRPCPutInt64(&packet, info.size); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtReadIndexDir(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 1) - if (argv[0].type == B_STRING_TYPE) - { - DIR *dir; - char indexName[100]; - - dir = (DIR *)(*((int32 *) argv[0].data)); - - error = btReadIndexDir(&dir, indexName); - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, strlen(indexName) + 8); - btRPCPutString(&packet, indexName, strlen(indexName)); - btRPCPutInt32(&packet, (int32) dir); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtCreateIndex(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 3) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_INT32_TYPE && argv[2].type == B_INT32_TYPE) - { - int type = *((int32 *) argv[1].data); - int flags = *((int32 *) argv[2].data); - - error = btCreateIndex(argv[0].data, type, flags); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtRemoveIndex(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 1) - if (argv[0].type == B_STRING_TYPE) - { - error = btRemoveIndex(argv[0].data); - btRPCCreateAck(&packet, xid, error, 0); - btRPCSendAck(client, &packet); - return; - } -} - -void netbtStatIndex(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 1) - if (argv[0].type == B_STRING_TYPE) - { - struct index_info info; - - error = btStatIndex(argv[0].data, &info); - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, 28); - btRPCPutInt32(&packet, info.type); - btRPCPutInt64(&packet, info.size); - btRPCPutInt32(&packet, info.modification_time); - btRPCPutInt32(&packet, info.creation_time); - btRPCPutInt32(&packet, info.uid); - btRPCPutInt32(&packet, info.gid); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -void netbtReadQuery(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client, error; - - client = session->socket; - if (argc == 2) - if (argv[0].type == B_STRING_TYPE && argv[1].type == B_STRING_TYPE) - { - DIR *dir; - char fileName[B_PATH_NAME_LENGTH]; - int64 inode; - - dir = (DIR *)(*((int32 *) argv[0].data)); - - error = btReadQuery(&dir, argv[1].data, fileName, &inode); - if (error == B_OK) - { - btRPCCreateAck(&packet, xid, B_OK, strlen(fileName) + 16); - btRPCPutInt64(&packet, inode); - btRPCPutString(&packet, fileName, strlen(fileName)); - btRPCPutInt32(&packet, (int32) dir); - } - else - btRPCCreateAck(&packet, xid, error, 0); - - btRPCSendAck(client, &packet); - return; - } -} - -// netbtQuit() -// -void netbtQuit(bt_session_t *session, unsigned int xid, int argc, bt_arg_t argv[]) -{ - bt_outPacket packet; - int client; - - client = session->socket; - if (argc == 0) - { - btRPCCreateAck(&packet, xid, B_OK, 0); - btRPCSendAck(client, &packet); - } -} - diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/betalk.h b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/betalk.h deleted file mode 100644 index 0575c5e0b6..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/betalk.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef _BETALK_H_ -#define _BETALK_H_ - -// BeOS-specific includes -#include "TypeConstants.h" -#include "Errors.h" -#include "OS.h" -#include "fs_attr.h" -#include "fs_query.h" -#include "fs_index.h" -#include "Mime.h" -#include "netdb.h" - -// POSIX includes -#include "stdio.h" -#include "dirent.h" -#include "malloc.h" -#include "string.h" -#include "sys/stat.h" -#include "fcntl.h" -#include "errno.h" -#include "socket.h" -#include "ctype.h" - -#ifndef NULL -#define NULL 0L -#endif - -#ifndef INVALID_SOCKET -#define INVALID_SOCKET (int)(~0) -#endif - -#define BT_TCPIP_PORT 8000 -#define BT_QUERYHOST_PORT 8001 - -#define BT_CMD_TERMINATOR 13 -#define BT_CMD_MOUNT 1 -#define BT_CMD_FSINFO 2 -#define BT_CMD_LOOKUP 3 -#define BT_CMD_STAT 4 -#define BT_CMD_READDIR 5 -#define BT_CMD_READ 6 -#define BT_CMD_WRITE 7 -#define BT_CMD_CREATE 8 -#define BT_CMD_TRUNCATE 9 -#define BT_CMD_MKDIR 10 -#define BT_CMD_RMDIR 11 -#define BT_CMD_RENAME 12 -#define BT_CMD_UNLINK 13 -#define BT_CMD_READLINK 14 -#define BT_CMD_SYMLINK 15 -#define BT_CMD_WSTAT 16 -#define BT_CMD_READATTRIB 50 -#define BT_CMD_WRITEATTRIB 51 -#define BT_CMD_READATTRIBDIR 52 -#define BT_CMD_REMOVEATTRIB 53 -#define BT_CMD_STATATTRIB 54 -#define BT_CMD_READINDEXDIR 60 -#define BT_CMD_CREATEINDEX 61 -#define BT_CMD_REMOVEINDEX 62 -#define BT_CMD_STATINDEX 63 -#define BT_CMD_READQUERY 70 -#define BT_CMD_QUIT 255 - -#define BT_RPC_SIGNATURE "btRPC" -#define BT_RPC_VERSION_HI 0 -#define BT_RPC_VERSION_LO 1 - -#define BT_MAX_IO_BUFFER 16384 -#define BT_RPC_MIN_PACKET_SIZE 64 -#define BT_RPC_MAX_PACKET_SIZE (BT_MAX_IO_BUFFER + 1024) - -#define MAX_COMMAND_ARGS 10 -#define MAX_ENTRY_VERSIONS 10 - -typedef struct -{ - unsigned int blockSize; - unsigned int totalBlocks; - unsigned int freeBlocks; -} bt_fsinfo; - -#define BT_COOKIE_SIZE 4 -#define BT_QUERY_COOKIE_SIZE 4 -#define BT_FILE_HANDLE_SIZE 32 - -typedef struct btFileHandle -{ - char opaque[BT_FILE_HANDLE_SIZE]; -} btFileHandle; - -typedef struct btCookie -{ - char opaque[BT_COOKIE_SIZE]; -} btCookie; - -typedef struct btQueryCookie -{ - char opaque[BT_COOKIE_SIZE]; - char *query; -} btQueryCookie; - -typedef struct -{ - unsigned int size; - unsigned int length; - char *buffer; -} bt_outPacket; - -typedef struct -{ - unsigned int length; - unsigned int offset; - char *buffer; -} bt_inPacket; - -typedef struct rpcCall -{ - unsigned int xid; - sem_id sem; - bt_inPacket *inPacket; - struct rpcCall *next; - struct rpcCall *prev; -} bt_rpccall; - -// RPC Operations -unsigned int btRPCGetInt32(bt_inPacket *packet); -int64 btRPCGetInt64(bt_inPacket *packet); -char * btRPCGetNewString(bt_inPacket *packet); -int btRPCGetString(bt_inPacket *packet, char *buffer, int length); -int btRPCGetHandle(bt_inPacket *packet, btFileHandle *fhandle); -int btRPCGetStat(bt_inPacket *packet, struct stat *st); -bt_outPacket * btRPCPutHeader(unsigned char command, unsigned char argc); -void btRPCPutArg(bt_outPacket *packet, unsigned int type, void *data, int length); -void btRPCPutChar(bt_outPacket *packet, char value); -void btRPCPutInt32(bt_outPacket *packet, int32 value); -void btRPCPutInt64(bt_outPacket *packet, int64 value); -void btRPCPutString(bt_outPacket *packet, char *buffer, int length); -void btRPCPutBinary(bt_outPacket *packet, void *buffer, int length); -void btRPCPutHandle(bt_outPacket *packet, btFileHandle *fhandle); -void btRPCPutStat(bt_outPacket *packet, struct stat *st); - -bt_rpccall * btRPCInvoke(int session, bt_outPacket *packet); -bt_outPacket *btRPCCreateAck(unsigned int xid, int error, int length); -void btRPCSendAck(int client, bt_outPacket *packet); - -#endif diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/btClient.c b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/btClient.c deleted file mode 100644 index c7ab7615f1..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/btClient.c +++ /dev/null @@ -1,1628 +0,0 @@ -// LDAPAdd.cpp : Defines the entry point for the console application. -// - -#include "betalk.h" - -#include "netdb.h" -#include "nfs_add_on.h" -#include "ksocket.h" - -#define BT_RPC_THREAD_NAME "BeServed Client RPC" -#define BT_MAX_TOTAL_RETRIES 3 -#define BT_RETRIES_BEFORE_RESTART 1 - -typedef struct mimeCache -{ - vnode_id vnid; - time_t time; - char mimeType[256]; - struct mimeCache *prev, *next; -} bt_mimeCacheNode; - - -int btConnect(unsigned int serverIP, int port); -void btDisconnect(int session); -void btReconnect(); -int32 btRPCReceive(void *data); -void btRPCInit(fs_nspace *ns); -void btRPCClose(); - -void btRPCRecordCall(bt_rpccall *call); -void btRPCRemoveCall(bt_rpccall *call); -void btRPCFreeCall(bt_rpccall *call); -void btCreateInPacket(bt_rpccall *call, char *buffer, unsigned int length); -void btDestroyInPacket(bt_inPacket *packet); - -void btAddToMimeCache(vnode_id vnid, char *mimeType, char *pktBuffer); -bt_mimeCacheNode *btRemoveFromMimeCache(bt_mimeCacheNode *deadNode); -char *btGetMimeType(vnode_id vnid); - -int btMount(int session, char *shareName, vnode_id *vnid); -int btLookup(int session, vnode_id dir_vnid, char *file, vnode_id *file_vnid, struct stat *st); -int btStat(int session, vnode_id vnid, struct stat *st); -int btGetFSInfo(int session, btFileHandle *root, bt_fsinfo *fsinfo); -int btReadDir(int session, btFileHandle *dhandle, vnode_id *vnid, char **filename, btCookie *cookie, struct stat *st); -size_t btRead(int session, btFileHandle *fhandle, off_t pos, size_t len, char *buf); -int btCreate(int session, btFileHandle *dhandle, char *name, vnode_id *file_vnid, int omode, int perms, struct stat *st); -int btTruncate(int session, btFileHandle *fhandle, int64 len); -int btUnlink(int session, btFileHandle *dhandle, char *name); -int btCreateDir(int session, btFileHandle *dhandle, char *name, int perms, vnode_id *file_vnid, struct stat *st); -int btRename(int session, btFileHandle *oldDHandle, char *oldName, btFileHandle *newDHandle, char *newName); -int btDeleteDir(int session, btFileHandle *dhandle, char *name); -int btReadLink(int session, btFileHandle *fhandle, char *buf, size_t *bufsize); -int btSymLink(int session, btFileHandle *dhandle, char *name, char *path); -int btReadAttrib(int session, btFileHandle *fhandle, char *name, int type, void *buffer, size_t len, off_t pos); -int btWriteAttrib(int session, btFileHandle *fhandle, char *name, int type, void *buffer, size_t len, off_t pos); -int btReadAttribDir(int session, btFileHandle *fhandle, char **attrName, btCookie *cookie); -int btRemoveAttrib(int session, btFileHandle *fhandle, char *name); -int btStatAttrib(int session, btFileHandle *fhandle, char *name, struct attr_info *info); -int btReadIndexDir(int session, char **indexName, int bufLength, btCookie *cookie); -int btCreateIndex(int session, char *name, int type, int flags); -int btRemoveIndex(int session, char *name); -int btStatIndex(int session, char *name, struct index_info *buf); -int btReadQuery(int session, char **fileName, int64 *inode, btQueryCookie *cookie); - - -bt_rpccall *rootCall = NULL; -bt_mimeCacheNode *mimeRoot = NULL; - -thread_id rpcThread = 0; -sem_id callSem; -sem_id connectSem; -sem_id mimeSem; - -fs_nspace *lastFS; - -unsigned int lastServerIP; -int lastPort; - -vint32 fsRefCount = 0; -vint32 nextXID = 1; -int32 quitXID = 0; - - -void btRPCInit(fs_nspace *ns) -{ - lastFS = ns; - - callSem = create_sem(1, "rpcCall"); - set_sem_owner(callSem, B_SYSTEM_TEAM); - - connectSem = create_sem(1, "rpcConnection"); - set_sem_owner(connectSem, B_SYSTEM_TEAM); - - // Find the RPC response recipient thread. If none can be found, create one. - // Otherwise, set the thread ID back to zero so that when we shut down, we - // won't try to kill a thread we didn't create. -// if (fsRefCount == 0) -// { - rpcThread = spawn_kernel_thread(btRPCReceive, BT_RPC_THREAD_NAME, B_NORMAL_PRIORITY, ns); - resume_thread(rpcThread); -// } -// else -// rpcThread = 0; -} - -void btRPCClose() -{ -// if (fsRefCount == 0) - if (rpcThread > 0) - { - status_t exitVal; - wait_for_thread(rpcThread, &exitVal); - } - - // Close the socket used for all file system RPC communications, - // now that we know the RPC recipient thread is dead. - kclosesocket(lastFS->s); - - delete_sem(connectSem); - delete_sem(callSem); - -// if (fsRefCount == 0) - lastFS = NULL; -} - -int32 btRPCReceive(void *data) -{ - fs_nspace *ns = (fs_nspace *) data; - bt_rpccall *call; - char signature[20], *buffer; - int32 xid, nsid, length, sigLen, bytesRead; - int sock = ns->s; - - while (true) - { - sigLen = strlen(BT_RPC_SIGNATURE); - memset(signature, 0, sigLen); - if (krecv(sock, signature, sigLen, 0) == 0) - continue; - - signature[sigLen] = 0; - if (strcmp(signature, BT_RPC_SIGNATURE)) - continue; - -// krecv(sock, &nsid, sizeof(nsid), 0); - krecv(sock, &xid, sizeof(int32), 0); - krecv(sock, &length, sizeof(int32), 0); - - if (length == 0 || length >= BT_RPC_MAX_PACKET_SIZE) - continue; - - buffer = (char *) malloc(length + 1); - if (!buffer) - continue; - - bytesRead = 0; - do - { - bytesRead += krecv(sock, buffer + bytesRead, length - bytesRead, 0); - } while (bytesRead < length); - - buffer[length] = 0; - - while (acquire_sem(callSem) == B_INTERRUPTED); - - call = rootCall; - while (call) - { -// if (call->nsid == nsid) - if (call->xid == xid) - { - btCreateInPacket(call, buffer, length); - release_sem(call->sem); - break; - } - - call = call->next; - } - - release_sem(callSem); - - // The originating RPC call was not found. This is probably not a very - // good sign. - if (!call) - free(buffer); - - // If a valid quit XID has been defined, and it's equal to the current - // XID, quit. - if (!fsRefCount && quitXID) - if (quitXID == xid) - break; - } -} - -void btCreateInPacket(bt_rpccall *call, char *buffer, unsigned int length) -{ - bt_inPacket *packet; - - packet = (bt_inPacket *) malloc(sizeof(bt_inPacket)); - if (!packet) - return; - - packet->buffer = buffer; - packet->length = length; - packet->offset = 0; - - call->inPacket = packet; -} - -void btDestroyInPacket(bt_inPacket *packet) -{ - if (packet) - { - if (packet->buffer) - free(packet->buffer); - - free(packet); - } -} - -void btRPCRecordCall(bt_rpccall *call) -{ - bt_rpccall *curCall, *lastCall; - - while (acquire_sem(callSem) == B_INTERRUPTED); - - curCall = lastCall = rootCall; - while (curCall) - { - lastCall = curCall; - curCall = curCall->next; - } - - call->next = NULL; - call->prev = lastCall; - - if (lastCall == NULL) - rootCall = call; - else - lastCall->next = call; - - release_sem(callSem); -} - -// btRPCRemoveCall() -// -void btRPCRemoveCall(bt_rpccall *call) -{ - if (call) - { - while (acquire_sem(callSem) == B_INTERRUPTED); - - if (call->sem > 0) - delete_sem(call->sem); - - // Make this entry's predecessor point to its successor. - if (call->prev) - call->prev->next = call->next; - - // Make this entry's successor point to its predecessor. - if (call->next) - call->next->prev = call->prev; - - // If an inbound packet was ever received for this RPC call, - // deallocate it now. - call->finished = true; - - release_sem(callSem); - } -} - -// btRPCFreeCall() -// -void btRPCFreeCall(bt_rpccall *call) -{ - if (call) - { -// btDestroyInPacket(call->inPacket); -// free(call); - } -} - -// btConnect() -// -int btConnect(unsigned int serverIP, int port) -{ - struct sockaddr_in serverAddr; - int session, addrLen; - - lastServerIP = serverIP; - lastPort = port; - - // Store the length of the socket addressing structure for accept(). - addrLen = sizeof(struct sockaddr_in); - - // Initialize the server address structure. - memset(&serverAddr, 0, sizeof(serverAddr)); - serverAddr.sin_port = htons(port); - serverAddr.sin_family = AF_INET; - serverAddr.sin_addr.s_addr = htonl(serverIP); // inet_addr(server); // 16777343; - - // Create a new socket to receive incoming requests. - session = ksocket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (session == INVALID_SOCKET) - return INVALID_SOCKET; - - // Bind that socket to the address constructed above. - if (kconnect(session, (struct sockaddr *) &serverAddr, sizeof(serverAddr))) - return INVALID_SOCKET; - - atomic_add(&fsRefCount, 1); - return session; -} - -void btDisconnect(int session) -{ - bt_outPacket *packet; - bt_rpccall *call; - - // Note that we decrement the file system reference count before we - // actually send the QUIT command, since the RPC response recipient - // thread will need to exit when the packet is received and potentially - // before we regain control here. The worst case would be that - // transmission of the QUIT command fails, and the recipient thread is - // left running. However, it will either be re-used on the next - // mount or sit idle in a recv() call. - atomic_add(&fsRefCount, -1); - - packet = btRPCPutHeader(BT_CMD_QUIT, 0, 0); - call = btRPCInvoke(session, packet, true); - if (call) - btRPCRemoveCall(call); -} - -bt_outPacket *btRPCPutHeader(unsigned char command, unsigned char argc, int32 length) -{ - bt_outPacket *packet; - - packet = (bt_outPacket *) malloc(sizeof(bt_outPacket)); - if (!packet) - return NULL; - - packet->size = BT_RPC_MIN_PACKET_SIZE; - packet->buffer = (char *) malloc(packet->size); - packet->length = 0; - - if (!packet->buffer) - { - free(packet); - return NULL; - } - - strcpy(packet->buffer, BT_RPC_SIGNATURE); - packet->length += strlen(BT_RPC_SIGNATURE); - -// btRPCPutChar(packet, BT_RPC_VERSION_HI); -// btRPCPutChar(packet, BT_RPC_VERSION_LO); - btRPCPutInt32(packet, 7 + (8 * argc) + length); - btRPCPutChar(packet, command); - btRPCPutChar(packet, argc); - - return packet; -} - -void btRPCPutArg(bt_outPacket *packet, unsigned int type, void *data, int length) -{ - btRPCPutInt32(packet, type); - btRPCPutInt32(packet, length); - btRPCPutBinary(packet, data, length); -} - -bt_rpccall *btRPCInvoke(int session, bt_outPacket *packet, bool lastPkt) -{ - status_t result; - bt_rpccall *call; - int retries; - int32 bytesSent; - - call = (bt_rpccall *) malloc(sizeof(bt_rpccall)); - if (!call) - return NULL; - - retries = 0; - - call->inPacket = NULL; - call->finished = false; - call->xid = atomic_add(&nextXID, 1); - if ((call->sem = create_sem(0, "rpc call")) < B_OK) - { - free(call); - return NULL; - } - - set_sem_owner(call->sem, B_SYSTEM_TEAM); - btRPCRecordCall(call); - -// btRPCPutInt32(packet, call->nsid); - btRPCPutInt32(packet, call->xid); - btRPCPutChar(packet, BT_CMD_TERMINATOR); - - // If this is the last RPC packet that will be transmitted, store - // its XID so the RPC recipient thread will know when to quit. - if (lastPkt) - quitXID = call->xid; - -doSend: - bytesSent = 0; - do - { - int bytes; - bytes = ksend(session, packet->buffer + bytesSent, packet->length - bytesSent, 0); - if (bytes > 0) - bytesSent += bytes; - } while (bytesSent < packet->length); - - do - { - result = acquire_sem_etc(call->sem, 1, B_RELATIVE_TIMEOUT, 5000000); - } - while (result == B_INTERRUPTED); - - if (result == B_TIMED_OUT) - { - retries++; - if (retries > BT_MAX_TOTAL_RETRIES) - { - free(packet->buffer); - free(packet); - btRPCRemoveCall(call); - return NULL; - } - else if (retries > BT_RETRIES_BEFORE_RESTART) - btReconnect(); - - goto doSend; - } - - free(packet->buffer); - free(packet); - return call; -} - -void btReconnect() -{ - static int counter = 0; - int curCount = counter; - - while (acquire_sem(connectSem) == B_INTERRUPTED); - - if (curCount == counter) - { - kclosesocket(lastFS->s); - atomic_add(&fsRefCount, -1); - - lastFS->s = btConnect(lastServerIP, lastPort); - - if (rpcThread > 0) - { - kill_thread(rpcThread); - rpcThread = spawn_kernel_thread(btRPCReceive, BT_RPC_THREAD_NAME, B_NORMAL_PRIORITY, lastFS); - resume_thread(rpcThread); - } - - counter++; - } - - release_sem(connectSem); -} - -void btRPCGrowPacket(bt_outPacket *packet, int bytes) -{ - if (packet->length + bytes > packet->size) - { - int growth = ((bytes / BT_RPC_MIN_PACKET_SIZE) + 1) * BT_RPC_MIN_PACKET_SIZE; - packet->buffer = (char *) realloc(packet->buffer, packet->size + growth); - packet->size += growth; - } -} - -unsigned int btRPCGetInt32(bt_inPacket *packet) -{ - int32 value; - - if (packet->offset < packet->length) - value = *((int32 *) &packet->buffer[packet->offset]); - else - value = 0; - - packet->offset += sizeof(value); - return value; -} - -int64 btRPCGetInt64(bt_inPacket *packet) -{ - int64 value; - - if (packet->offset < packet->length) - value = *((int64 *) &packet->buffer[packet->offset]); - else - value = 0; - - packet->offset += sizeof(value); - return value; -} - -char *btRPCGetNewString(bt_inPacket *packet) -{ - char *str; - unsigned int bytes; - - if (packet->offset >= packet->length) - return NULL; - - bytes = *((int32 *) &packet->buffer[packet->offset]); - packet->offset += sizeof(bytes); - if (!bytes) - return NULL; - - str = (char *) malloc(bytes + 1); - if (!str) - return NULL; - - memcpy(str, &packet->buffer[packet->offset], bytes); - str[bytes] = 0; - - packet->offset += bytes; - - return str; -} - -int btRPCGetString(bt_inPacket *packet, char *buffer, int length) -{ - unsigned int bytes; - - if (packet->offset >= packet->length) - return 0; - - bytes = *((int32 *) &packet->buffer[packet->offset]); - packet->offset += sizeof(bytes); - if (!bytes) - return 0L; - - if (length < bytes) - return ERANGE; - - memcpy(buffer, &packet->buffer[packet->offset], bytes); - packet->offset += bytes; - return bytes; -} - -int btRPCGetHandle(bt_inPacket *packet, btFileHandle *fhandle) -{ - memcpy(fhandle->opaque, &packet->buffer[packet->offset], BT_FILE_HANDLE_SIZE); - packet->offset += BT_FILE_HANDLE_SIZE; - return B_OK; -} - -void btRPCPutChar(bt_outPacket *packet, char value) -{ - btRPCGrowPacket(packet, sizeof(value)); - packet->buffer[packet->length] = value; - packet->length += sizeof(value); -} - -void btRPCPutInt32(bt_outPacket *packet, int32 value) -{ - btRPCGrowPacket(packet, sizeof(value)); - *(int32 *)(&packet->buffer[packet->length]) = value; - packet->length += sizeof(value); -} - -void btRPCPutInt64(bt_outPacket *packet, int64 value) -{ - btRPCGrowPacket(packet, sizeof(value)); - *(int64 *)(&packet->buffer[packet->length]) = value; - packet->length += sizeof(value); -} - -void btRPCPutString(bt_outPacket *packet, char *buffer, int length) -{ - if (packet && buffer) - { - btRPCGrowPacket(packet, sizeof(length) + length); - btRPCPutInt32(packet, length); - memcpy(&packet->buffer[packet->length], buffer, length); - packet->length += length; - } -} - -void btRPCPutBinary(bt_outPacket *packet, void *buffer, int length) -{ - if (packet && buffer) - { - btRPCGrowPacket(packet, length); - memcpy(&packet->buffer[packet->length], buffer, length); - packet->length += length; - } -} - -void btRPCPutHandle(bt_outPacket *packet, btFileHandle *fhandle) -{ - if (packet && fhandle) - { - btRPCGrowPacket(packet, BT_FILE_HANDLE_SIZE); - memcpy(&packet->buffer[packet->length], fhandle->opaque, BT_FILE_HANDLE_SIZE); - packet->length += BT_FILE_HANDLE_SIZE; - } -} - -int btRPCGetStat(bt_inPacket *packet, struct stat *st) -{ - st->st_dev = 0; - st->st_nlink = btRPCGetInt32(packet); - st->st_uid = btRPCGetInt32(packet); - st->st_gid = btRPCGetInt32(packet); - st->st_size = btRPCGetInt64(packet); - st->st_blksize = btRPCGetInt32(packet); - st->st_rdev = btRPCGetInt32(packet); - st->st_ino = btRPCGetInt64(packet); - st->st_mode = btRPCGetInt32(packet); - st->st_atime = btRPCGetInt32(packet); - st->st_mtime = btRPCGetInt32(packet); - st->st_ctime = btRPCGetInt32(packet); -} - -void btRPCPutStat(bt_outPacket *packet, struct stat *st) -{ - if (packet && st) - { - btRPCPutInt32(packet, (int) st->st_nlink); - btRPCPutInt32(packet, (int) st->st_uid); - btRPCPutInt32(packet, (int) st->st_gid); - btRPCPutInt64(packet, (int64) st->st_size); - btRPCPutInt32(packet, (int) st->st_blksize); - btRPCPutInt32(packet, (int) st->st_rdev); - btRPCPutInt64(packet, (int64) st->st_ino); - btRPCPutInt32(packet, (int) st->st_mode); - btRPCPutInt32(packet, (int) st->st_atime); - btRPCPutInt32(packet, (int) st->st_mtime); - btRPCPutInt32(packet, (int) st->st_ctime); - } -} - -void btEmptyLPBCache(btCookie *cookie) -{ - if (cookie->lpbCache) - { - cookie->lpbCache = false; - if (cookie->inPacket.buffer) - { - free(cookie->inPacket.buffer); - cookie->inPacket.buffer = NULL; - } - } -} - -// btMount() -// -int btMount(int session, char *shareName, btFileHandle *rootNode) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_MOUNT, 1, strlen(shareName)); - btRPCPutArg(outPacket, B_STRING_TYPE, shareName, strlen(shareName)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - btRPCGetHandle(inPacket, rootNode); - } - - btRPCRemoveCall(call); - } - - return error; -} - -// btLookup() -// -int btLookup(int session, btFileHandle *dhandle, char *file, btFileHandle *fhandle, struct stat *st) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_LOOKUP, 2, BT_FILE_HANDLE_SIZE + strlen(file)); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, file, strlen(file)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - btRPCGetHandle(inPacket, fhandle); - btRPCGetStat(inPacket, st); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -// btStat() -// -int btStat(int session, btFileHandle *fhandle, struct stat *st) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_STAT, 1, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - btRPCGetStat(inPacket, st); - } - - btRPCRemoveCall(call); - } - - return error; -} - -// btGetFSInfo() -// -int btGetFSInfo(int session, btFileHandle *root, bt_fsinfo *fsinfo) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_FSINFO, 1, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, root->opaque, BT_FILE_HANDLE_SIZE); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - fsinfo->blockSize = btRPCGetInt32(inPacket); - fsinfo->totalBlocks = btRPCGetInt32(inPacket); - fsinfo->freeBlocks = btRPCGetInt32(inPacket); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -// btReadDir() -// -int btReadDir(int session, btFileHandle *dhandle, vnode_id *vnid, char **filename, btCookie *cookie, btFileHandle *fhandle, struct stat *st) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - char *mimeType; - int error, value; - - error = EHOSTUNREACH; - call = NULL; - inPacket = NULL; - *filename = NULL; - *vnid = 0; - - if (cookie->eof) - return ENOENT; - - // If no entries are currently cached, construct a call to the server to - // obtain the next series of directory entries. - if (cookie->lpbCache) - { - // If we had an existing packet buffer stored, remove it now. - inPacket = &cookie->inPacket; - if (inPacket->offset >= inPacket->length) - btEmptyLPBCache(cookie); - } - - if (!cookie->lpbCache) - { - outPacket = btRPCPutHeader(BT_CMD_READDIR, 2, BT_FILE_HANDLE_SIZE + BT_COOKIE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, cookie->opaque, BT_COOKIE_SIZE); - call = btRPCInvoke(session,"outPacket, false); - - if (call) - { - cookie->inPacket.buffer = (char *) malloc(call->inPacket->length); - if (cookie->inPacket.buffer) - { - inPacket = &cookie->inPacket; - memcpy(inPacket->buffer, call->inPacket->buffer, call->inPacket->length); - inPacket->length = call->inPacket->length; - inPacket->offset = 0; - cookie->lpbCache = true; - } - } - } - - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - *vnid = btRPCGetInt64(inPacket); - *filename = btRPCGetNewString(inPacket); - if (!*filename) - return ENOENT; - - value = btRPCGetInt32(inPacket); - memcpy(cookie->opaque, &value, sizeof(value)); - btRPCGetHandle(inPacket, fhandle); - btRPCGetStat(inPacket, st); - } - else - { - btEmptyLPBCache(cookie); - cookie->eof = true; - } - } - - if (call) - btRPCRemoveCall(call); - - return error; -} - -// btRead() -// -size_t btRead(int session, btFileHandle *fhandle, off_t pos, size_t len, char *buf) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - struct stat st; - size_t bytesRead, filePos; - int32 byteCount; - int error; - - error = B_OK; - bytesRead = 0; - filePos = pos; - - // Get the file size from the server and verify we're not going beyond it. - // If we're already positioned at the end of the file, there's no point in - // trying to read any further. - btStat(session, fhandle, &st); - if (filePos >= st.st_size) - return 0; - - while (filePos < st.st_size && bytesRead < len && error == B_OK) - { - byteCount = min(BT_MAX_IO_BUFFER, len - bytesRead); - - outPacket = btRPCPutHeader(BT_CMD_READ, 3, BT_FILE_HANDLE_SIZE + 8); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_INT32_TYPE, &filePos, sizeof(filePos)); - btRPCPutArg(outPacket, B_INT32_TYPE, &byteCount, sizeof(byteCount)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - int32 bytesRecv; - bytesRecv = btRPCGetString(inPacket, buf + bytesRead, byteCount); - bytesRead += bytesRecv; - filePos += bytesRecv; - } - } - - btRPCRemoveCall(call); - } - } - - return bytesRead; -} - -// btWrite() -// -size_t btWrite(int session, btFileHandle *fhandle, off_t pos, size_t len, char *buf) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - struct stat st; - size_t bytesWritten; - int32 byteCount; - int error; - off_t curPos; - - error = B_OK; - bytesWritten = 0; - curPos = pos; - - // Get the file size from the server and verify we're not going beyond it. - // If we're already positioned at the end of the file, there's no point in - // trying to write any further. - btStat(session, fhandle, &st); - if (pos > st.st_size + 1) - return 0; - - while (bytesWritten < len && error == B_OK) - { - byteCount = min(BT_MAX_IO_BUFFER, len - bytesWritten); - - outPacket = btRPCPutHeader(BT_CMD_WRITE, 4, BT_FILE_HANDLE_SIZE + 12 + byteCount); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_INT64_TYPE, &curPos, sizeof(curPos)); - btRPCPutArg(outPacket, B_INT32_TYPE, &byteCount, sizeof(byteCount)); - btRPCPutArg(outPacket, B_STRING_TYPE, buf + bytesWritten, byteCount); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - int bytes = btRPCGetInt32(inPacket); - bytesWritten += bytes; - curPos += bytes; - } - } - - btRPCRemoveCall(call); - } - else - error = EHOSTUNREACH; - } - - return bytesWritten; -} - -int btCreate(int session, btFileHandle *dhandle, char *name, btFileHandle *fhandle, int omode, int perms, struct stat *st) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_CREATE, 4, BT_FILE_HANDLE_SIZE + strlen(name) + 8); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - btRPCPutArg(outPacket, B_INT32_TYPE, &omode, sizeof(omode)); - btRPCPutArg(outPacket, B_INT32_TYPE, &perms, sizeof(perms)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - btRPCGetHandle(inPacket, fhandle); - btRPCGetStat(inPacket, st); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -int btTruncate(int session, btFileHandle *fhandle, int64 len) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_TRUNCATE, 2, BT_FILE_HANDLE_SIZE + 8); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_INT64_TYPE, &len, sizeof(len)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btUnlink(int session, btFileHandle *dhandle, char *name) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_UNLINK, 2, BT_FILE_HANDLE_SIZE + strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btCreateDir(int session, btFileHandle *dhandle, char *name, int perms, btFileHandle *fhandle, struct stat *st) - -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_MKDIR, 3, BT_FILE_HANDLE_SIZE + strlen(name) + 4); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - btRPCPutArg(outPacket, B_INT32_TYPE, &perms, sizeof(perms)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - btRPCGetHandle(inPacket, fhandle); - btRPCGetStat(inPacket, st); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -int btRename(int session, btFileHandle *oldDHandle, char *oldName, btFileHandle *newDHandle, char *newName) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_RENAME, 4, 2 * BT_FILE_HANDLE_SIZE + strlen(oldName) + strlen(newName)); - btRPCPutArg(outPacket, B_STRING_TYPE, oldDHandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, oldName, strlen(oldName)); - btRPCPutArg(outPacket, B_STRING_TYPE, newDHandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, newName, strlen(newName)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btDeleteDir(int session, btFileHandle *dhandle, char *name) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_RMDIR, 2, BT_FILE_HANDLE_SIZE + strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btReadLink(int session, btFileHandle *fhandle, char *buf, size_t *bufsize) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_READLINK, 1, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - *bufsize = (size_t) btRPCGetInt32(inPacket); - if (*bufsize > 0) - btRPCGetString(inPacket, buf, (int) *bufsize); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -int btSymLink(int session, btFileHandle *dhandle, char *name, char *path) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_SYMLINK, 3, BT_FILE_HANDLE_SIZE + strlen(name) + strlen(path)); - btRPCPutArg(outPacket, B_STRING_TYPE, dhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, path, strlen(path)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btWStat(int session, btFileHandle *fhandle, struct stat *st, long mask) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_WSTAT, 8, BT_FILE_HANDLE_SIZE + 28); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_INT32_TYPE, &mask, sizeof(mask)); - btRPCPutArg(outPacket, B_INT32_TYPE, &st->st_mode, sizeof(int32)); - btRPCPutArg(outPacket, B_INT32_TYPE, &st->st_uid, sizeof(int32)); - btRPCPutArg(outPacket, B_INT32_TYPE, &st->st_gid, sizeof(int32)); - btRPCPutArg(outPacket, B_INT32_TYPE, &st->st_size, sizeof(int32)); - btRPCPutArg(outPacket, B_INT32_TYPE, &st->st_atime, sizeof(int32)); - btRPCPutArg(outPacket, B_INT32_TYPE, &st->st_mtime, sizeof(int32)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btReadAttrib(int session, btFileHandle *fhandle, char *name, int type, void *buffer, size_t len, off_t pos) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - int32 bytesRead; - int32 newlen = (int32) len; - int32 newpos = (int32) pos; - - bytesRead = -1; - - outPacket = btRPCPutHeader(BT_CMD_READATTRIB, 5, BT_FILE_HANDLE_SIZE + strlen(name) + 12); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - btRPCPutArg(outPacket, B_INT32_TYPE, &type, sizeof(type)); - btRPCPutArg(outPacket, B_INT32_TYPE, &newpos, sizeof(newpos)); - btRPCPutArg(outPacket, B_INT32_TYPE, &newlen, sizeof(newlen)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - bytesRead = btRPCGetInt32(inPacket); - if (bytesRead > 0) - btRPCGetString(inPacket, (char *) buffer, len); - } - else - { - bytesRead = -1; - errno = error; - } - } - - btRPCRemoveCall(call); - } - - return bytesRead; -} - -int btWriteAttrib(int session, btFileHandle *fhandle, char *name, int type, void *buffer, size_t len, off_t pos) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - int32 bytesWritten; - int32 newlen = (int32) len; - int32 newpos = (int32) pos; - - bytesWritten = -1; - - outPacket = btRPCPutHeader(BT_CMD_WRITEATTRIB, 6, BT_FILE_HANDLE_SIZE + strlen(name) + len + 12); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - btRPCPutArg(outPacket, B_INT32_TYPE, &type, sizeof(type)); - btRPCPutArg(outPacket, B_STRING_TYPE, buffer, len); - btRPCPutArg(outPacket, B_INT32_TYPE, &newpos, sizeof(newpos)); - btRPCPutArg(outPacket, B_INT32_TYPE, &newlen, sizeof(newlen)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - bytesWritten = btRPCGetInt32(inPacket); - else - { - bytesWritten = -1; - errno = error; - } - } - - btRPCRemoveCall(call); - } - - return bytesWritten; -} - -int btReadAttribDir(int session, btFileHandle *fhandle, char **attrName, btCookie *cookie) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error, value; - - error = EHOSTUNREACH; - call = NULL; - inPacket = NULL; - *attrName = NULL; - - if (cookie->eof) - return ENOENT; - - // If no entries are currently cached, construct a call to the server to - // obtain the next series of directory entries. - if (cookie->lpbCache) - { - // If we had an existing packet buffer stored, remove it now. - inPacket = &cookie->inPacket; - if (inPacket->offset >= inPacket->length) - btEmptyLPBCache(cookie); - } - - if (!cookie->lpbCache) - { - outPacket = btRPCPutHeader(BT_CMD_READATTRIBDIR, 2, BT_FILE_HANDLE_SIZE + BT_COOKIE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, cookie->opaque, BT_COOKIE_SIZE); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - cookie->inPacket.buffer = (char *) malloc(call->inPacket->length); - if (cookie->inPacket.buffer) - { - inPacket = &cookie->inPacket; - memcpy(inPacket->buffer, call->inPacket->buffer, call->inPacket->length); - inPacket->length = call->inPacket->length; - inPacket->offset = 0; - cookie->lpbCache = true; - } - } - } - - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - *attrName = btRPCGetNewString(inPacket); - if (!*attrName) - return ENOENT; - - value = btRPCGetInt32(inPacket); - memcpy(cookie->opaque, &value, sizeof(value)); - } - else - { - btEmptyLPBCache(cookie); - cookie->eof = true; - } - } - - if (call) - btRPCRemoveCall(call); - - return error; -} - -int btRemoveAttrib(int session, btFileHandle *fhandle, char *name) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_REMOVEATTRIB, 2, BT_FILE_HANDLE_SIZE + strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btStatAttrib(int session, btFileHandle *fhandle, char *name, struct attr_info *info) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_STATATTRIB, 2, BT_FILE_HANDLE_SIZE + strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, fhandle->opaque, BT_FILE_HANDLE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - info->type = btRPCGetInt32(inPacket); - info->size = btRPCGetInt64(inPacket); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -int btReadIndexDir(int session, char **indexName, int bufLength, btCookie *cookie) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error, value; - - error = EHOSTUNREACH; - *indexName = NULL; - - if (cookie->eof) - return ENOENT; - - outPacket = btRPCPutHeader(BT_CMD_READINDEXDIR, 1, BT_COOKIE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, cookie->opaque, BT_COOKIE_SIZE); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - *indexName = btRPCGetNewString(inPacket); - value = btRPCGetInt32(inPacket); - memcpy(cookie->opaque, &value, sizeof(value)); - } - else - cookie->eof = true; - } - - btRPCRemoveCall(call); - } - - return error; -} - -int btCreateIndex(int session, char *name, int type, int flags) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_CREATEINDEX, 3, strlen(name) + 8); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - btRPCPutArg(outPacket, B_INT32_TYPE, &type, sizeof(type)); - btRPCPutArg(outPacket, B_INT32_TYPE, &flags, sizeof(flags)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btRemoveIndex(int session, char *name) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_REMOVEINDEX, 1, strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - error = btRPCGetInt32(inPacket); - - btRPCRemoveCall(call); - } - - return error; -} - -int btStatIndex(int session, char *name, struct index_info *buf) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_STATINDEX, 1, strlen(name)); - btRPCPutArg(outPacket, B_STRING_TYPE, name, strlen(name)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - buf->type = btRPCGetInt32(inPacket); - buf->size = btRPCGetInt64(inPacket); - buf->modification_time = btRPCGetInt32(inPacket); - buf->creation_time = btRPCGetInt32(inPacket); - buf->uid = btRPCGetInt32(inPacket); - buf->gid = btRPCGetInt32(inPacket); - } - } - - btRPCRemoveCall(call); - } - - return error; -} - -int btReadQuery(int session, char **fileName, int64 *inode, btQueryCookie *cookie) -{ - bt_inPacket *inPacket; - bt_outPacket *outPacket; - bt_rpccall *call; - int error, value; - - error = EHOSTUNREACH; - - outPacket = btRPCPutHeader(BT_CMD_READQUERY, 2, BT_QUERY_COOKIE_SIZE + strlen(cookie->query)); - btRPCPutArg(outPacket, B_STRING_TYPE, cookie->opaque, BT_QUERY_COOKIE_SIZE); - btRPCPutArg(outPacket, B_STRING_TYPE, cookie->query, strlen(cookie->query)); - call = btRPCInvoke(session, outPacket, false); - - if (call) - { - inPacket = call->inPacket; - if (inPacket) - { - error = btRPCGetInt32(inPacket); - if (error == B_OK) - { - *inode = btRPCGetInt64(inPacket); - *fileName = btRPCGetNewString(inPacket); - if (!*fileName) - error = ENOENT; - - value = btRPCGetInt32(inPacket); - memcpy(cookie->opaque, &value, sizeof(value)); - } - } - - btRPCRemoveCall(call); - } - - return error; -} diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/fsproto.h b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/fsproto.h deleted file mode 100644 index a6072837d5..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/fsproto.h +++ /dev/null @@ -1,246 +0,0 @@ -#ifndef _FSPROTO_H -#define _FSPROTO_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -typedef dev_t nspace_id; -typedef ino_t vnode_id; - -/* UGLY UGLY UGLY */ -#ifndef _DRIVERS_H -struct selectsync; -typedef struct selectsync selectsync; -#endif - - -/* - * PUBLIC PART OF THE FILE SYSTEM PROTOCOL - */ - -#define WSTAT_MODE 0x0001 -#define WSTAT_UID 0x0002 -#define WSTAT_GID 0x0004 -#define WSTAT_SIZE 0x0008 -#define WSTAT_ATIME 0x0010 -#define WSTAT_MTIME 0x0020 -#define WSTAT_CRTIME 0x0040 - -#define WFSSTAT_NAME 0x0001 - -#define B_ENTRY_CREATED 1 -#define B_ENTRY_REMOVED 2 -#define B_ENTRY_MOVED 3 -#define B_STAT_CHANGED 4 -#define B_ATTR_CHANGED 5 -#define B_DEVICE_MOUNTED 6 -#define B_DEVICE_UNMOUNTED 7 - -#define B_STOP_WATCHING 0x0000 -#define B_WATCH_NAME 0x0001 -#define B_WATCH_STAT 0x0002 -#define B_WATCH_ATTR 0x0004 -#define B_WATCH_DIRECTORY 0x0008 - -#define SELECT_READ 1 -#define SELECT_WRITE 2 -#define SELECT_EXCEPTION 3 - -#define B_CUR_FS_API_VERSION 2 - -struct attr_info; -struct index_info; - -typedef int op_read_vnode(void *ns, vnode_id vnid, char r, void **node); -typedef int op_write_vnode(void *ns, void *node, char r); -typedef int op_remove_vnode(void *ns, void *node, char r); -typedef int op_secure_vnode(void *ns, void *node); - -typedef int op_walk(void *ns, void *base, const char *file, char **newpath, - vnode_id *vnid); - -typedef int op_access(void *ns, void *node, int mode); - -typedef int op_create(void *ns, void *dir, const char *name, - int omode, int perms, vnode_id *vnid, void **cookie); -typedef int op_mkdir(void *ns, void *dir, const char *name, int perms); -typedef int op_symlink(void *ns, void *dir, const char *name, - const char *path); -typedef int op_link(void *ns, void *dir, const char *name, void *node); - -typedef int op_rename(void *ns, void *olddir, const char *oldname, - void *newdir, const char *newname); -typedef int op_unlink(void *ns, void *dir, const char *name); -typedef int op_rmdir(void *ns, void *dir, const char *name); - -typedef int op_readlink(void *ns, void *node, char *buf, size_t *bufsize); - -typedef int op_opendir(void *ns, void *node, void **cookie); -typedef int op_closedir(void *ns, void *node, void *cookie); -typedef int op_rewinddir(void *ns, void *node, void *cookie); -typedef int op_readdir(void *ns, void *node, void *cookie, long *num, - struct dirent *buf, size_t bufsize); - -typedef int op_open(void *ns, void *node, int omode, void **cookie); -typedef int op_close(void *ns, void *node, void *cookie); -typedef int op_free_cookie(void *ns, void *node, void *cookie); -typedef int op_read(void *ns, void *node, void *cookie, off_t pos, void *buf, - size_t *len); -typedef int op_write(void *ns, void *node, void *cookie, off_t pos, - const void *buf, size_t *len); -typedef int op_readv(void *ns, void *node, void *cookie, off_t pos, const iovec *vec, - size_t count, size_t *len); -typedef int op_writev(void *ns, void *node, void *cookie, off_t pos, const iovec *vec, - size_t count, size_t *len); -typedef int op_ioctl(void *ns, void *node, void *cookie, int cmd, void *buf, - size_t len); -typedef int op_setflags(void *ns, void *node, void *cookie, int flags); - -typedef int op_rstat(void *ns, void *node, struct stat *); -typedef int op_wstat(void *ns, void *node, struct stat *, long mask); -typedef int op_fsync(void *ns, void *node); - -typedef int op_select(void *ns, void *node, void *cookie, uint8 event, - uint32 ref, selectsync *sync); -typedef int op_deselect(void *ns, void *node, void *cookie, uint8 event, - selectsync *sync); - -typedef int op_initialize(const char *devname, void *parms, size_t len); -typedef int op_mount(nspace_id nsid, const char *devname, ulong flags, - void *parms, size_t len, void **data, vnode_id *vnid); -typedef int op_unmount(void *ns); -typedef int op_sync(void *ns); -typedef int op_rfsstat(void *ns, struct fs_info *); -typedef int op_wfsstat(void *ns, struct fs_info *, long mask); - - -typedef int op_open_attrdir(void *ns, void *node, void **cookie); -typedef int op_close_attrdir(void *ns, void *node, void *cookie); -typedef int op_rewind_attrdir(void *ns, void *node, void *cookie); -typedef int op_read_attrdir(void *ns, void *node, void *cookie, long *num, - struct dirent *buf, size_t bufsize); -typedef int op_remove_attr(void *ns, void *node, const char *name); -typedef int op_rename_attr(void *ns, void *node, const char *oldname, - const char *newname); -typedef int op_stat_attr(void *ns, void *node, const char *name, - struct attr_info *buf); - -typedef int op_write_attr(void *ns, void *node, const char *name, int type, - const void *buf, size_t *len, off_t pos); -typedef int op_read_attr(void *ns, void *node, const char *name, int type, - void *buf, size_t *len, off_t pos); - -typedef int op_open_indexdir(void *ns, void **cookie); -typedef int op_close_indexdir(void *ns, void *cookie); -typedef int op_rewind_indexdir(void *ns, void *cookie); -typedef int op_read_indexdir(void *ns, void *cookie, long *num, - struct dirent *buf, size_t bufsize); -typedef int op_create_index(void *ns, const char *name, int type, int flags); -typedef int op_remove_index(void *ns, const char *name); -typedef int op_rename_index(void *ns, const char *oldname, - const char *newname); -typedef int op_stat_index(void *ns, const char *name, struct index_info *buf); - -typedef int op_open_query(void *ns, const char *query, ulong flags, - port_id port, long token, void **cookie); -typedef int op_close_query(void *ns, void *cookie); -typedef int op_read_query(void *ns, void *cookie, long *num, - struct dirent *buf, size_t bufsize); - -typedef struct vnode_ops { - op_read_vnode (*read_vnode); - op_write_vnode (*write_vnode); - op_remove_vnode (*remove_vnode); - op_secure_vnode (*secure_vnode); - op_walk (*walk); - op_access (*access); - op_create (*create); - op_mkdir (*mkdir); - op_symlink (*symlink); - op_link (*link); - op_rename (*rename); - op_unlink (*unlink); - op_rmdir (*rmdir); - op_readlink (*readlink); - op_opendir (*opendir); - op_closedir (*closedir); - op_free_cookie (*free_dircookie); - op_rewinddir (*rewinddir); - op_readdir (*readdir); - op_open (*open); - op_close (*close); - op_free_cookie (*free_cookie); - op_read (*read); - op_write (*write); - op_readv (*readv); - op_writev (*writev); - op_ioctl (*ioctl); - op_setflags (*setflags); - op_rstat (*rstat); - op_wstat (*wstat); - op_fsync (*fsync); - op_initialize (*initialize); - op_mount (*mount); - op_unmount (*unmount); - op_sync (*sync); - op_rfsstat (*rfsstat); - op_wfsstat (*wfsstat); - op_select (*select); - op_deselect (*deselect); - op_open_indexdir (*open_indexdir); - op_close_indexdir (*close_indexdir); - op_free_cookie (*free_indexdircookie); - op_rewind_indexdir (*rewind_indexdir); - op_read_indexdir (*read_indexdir); - op_create_index (*create_index); - op_remove_index (*remove_index); - op_rename_index (*rename_index); - op_stat_index (*stat_index); - op_open_attrdir (*open_attrdir); - op_close_attrdir (*close_attrdir); - op_free_cookie (*free_attrdircookie); - op_rewind_attrdir (*rewind_attrdir); - op_read_attrdir (*read_attrdir); - op_write_attr (*write_attr); - op_read_attr (*read_attr); - op_remove_attr (*remove_attr); - op_rename_attr (*rename_attr); - op_stat_attr (*stat_attr); - op_open_query (*open_query); - op_close_query (*close_query); - op_free_cookie (*free_querycookie); - op_read_query (*read_query); -} vnode_ops; - -extern _IMPEXP_KERNEL int new_path(const char *path, char **copy); -extern _IMPEXP_KERNEL void free_path(char *p); - -extern _IMPEXP_KERNEL int notify_listener(int op, nspace_id nsid, - vnode_id vnida, vnode_id vnidb, - vnode_id vnidc, const char *name); -extern _IMPEXP_KERNEL void notify_select_event(selectsync *sync, uint32 ref); -extern _IMPEXP_KERNEL int send_notification(port_id port, long token, - ulong what, long op, nspace_id nsida, - nspace_id nsidb, vnode_id vnida, - vnode_id vnidb, vnode_id vnidc, - const char *name); -extern _IMPEXP_KERNEL int get_vnode(nspace_id nsid, vnode_id vnid, void **data); -extern _IMPEXP_KERNEL int put_vnode(nspace_id nsid, vnode_id vnid); -extern _IMPEXP_KERNEL int new_vnode(nspace_id nsid, vnode_id vnid, void *data); -extern _IMPEXP_KERNEL int remove_vnode(nspace_id nsid, vnode_id vnid); -extern _IMPEXP_KERNEL int unremove_vnode(nspace_id nsid, vnode_id vnid); -extern _IMPEXP_KERNEL int is_vnode_removed(nspace_id nsid, vnode_id vnid); - - -extern _EXPORT vnode_ops fs_entry; -extern _EXPORT int32 api_version; - -#endif diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/makefile b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/makefile deleted file mode 100644 index 5e8eb7ef7e..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/makefile +++ /dev/null @@ -1,319 +0,0 @@ -## BeOS Generic Makefile ## - -## Fill in the top section of this makefile to define exactly what sort of -## binary you are creating, and what sources, resources and libraries are -## needed to create it. The makefile will then determine the proper -## platform specific options. - -## Fill in the top section to define the binary being created and the makefile -## will make sure that all of the hard work is taken care of for you, for both -## PowerPC and Intel versions of the BeOS. - -## Application Specific Settings --------------------------------------------- - -# specify the name of the binary -NAME= betalk - -# specify the type of binary -# APP: Application -# SHARED: Shared library or add-on -# STATIC: Static library archive -# DRIVER: Kernel Driver -TYPE= DRIVER - -# specify the source files to use -# full paths or paths relative to the makefile can be included -# all files, regardless of directory, will have their object -# files created in the common object directory. -# Note that this means this makefile will not work correctly -# if two source files with the same name (source.c or source.cpp) -# are included from different directories. Also note that spaces -# in folder names do not work well with this makefile. -SRCS= nfs_add_on.c btClient.c - -# specify the resource files to use -# full path or a relative path to the resource file can be used. -RSRCS= - -#specify additional libraries to link against -# if libName.so or libName.a is the name of the library to link against -# then simply specify Name in the LIBS list -# if there is another naming scheme use the full binary -# name: my_library.so or my_lib.a -# libroot.so never needs to be specified here, although libbe.so does -LIBS= ksocket - -# specify the paths to directories where additional -# libraries are to be found. /boot/develop/lib/PLATFORM/ is -# already set. The paths can be full or relative to this -# makefile. The paths included may not be recursive, so -# specify all of the needed paths explicitly -# Directories containing source-files are automatically added. -LIBPATHS=ksocket_v3/libksocket/$(OBJ_DIR) - -# specify additional directories where header files can be found -# directories where sources are found are included automatically -# included. -INCPATHS= ksocket_v3/libksocket - -# specify the level of optimization that you desire -# NONE, SOME, FULL -OPTIMIZE= - -# specify any symbols to be defined. The symbols will be -# set to a value of 1. For example specify DEBUG if you want -# DEBUG=1 to be set when compiling. -DEFINES= - -# specify special warning levels -# if unspecified default warnings will be used -# NONE = supress all warnings -# ALL = enable all warnings -WARNINGS = - -# specify symbols -# if TRUE debug symbols will be created -SYMBOLS = - - -## Generic Makefile Rules --------------------------- -## DO NOT MODIFY BENEATH THIS LINE ----------------- - -# determine wheather running on x86 or ppc -MACHINE=$(shell uname -m) -ifeq ($(MACHINE), BePC) - CPU = x86 -else - CPU = ppc -endif - -# set the directory where object files and binaries will be created - OBJ_DIR := obj.$(CPU) - -# specify that the binary should be created in the object directory - TARGET := $(OBJ_DIR)/$(NAME) - -# specify the mimeset tool - MIMESET := mimeset - -# specify the tools for adding and removing resources - XRES = xres - -# SETTING: define debug symbols if desired -ifeq ($(SYMBOLS), TRUE) - CFLAGS += -g -endif - - -# platform specific settings - -# x86 Settings -ifeq ($(CPU), x86) -# set the compiler and compiler flags - CC = gcc - ##!! change next time : drivers get -no-fpic and -fpic goes away !! - CFLAGS += -fpic - -# SETTING: set the proper optimization level - ifeq ($(OPTIMIZE), FULL) - OPTIMIZER = -O3 - else - ifeq ($(OPTIMIZE), SOME) - OPTIMIZER = -O1 - else - ifeq ($(OPTIMIZE), NONE) - OPTIMIZER = - endif - endif - endif - - CFLAGS += $(OPTIMIZER) - -# SETTING: set warning level - ifeq ($(WARNINGS), ALL) - CFLAGS += -Wall -Wno-multichar -Wno-ctor-dtor-privacy - else - ifeq ($(WARNINGS), NONE) - - endif - endif - -# set the linker and linker flags - LD = gcc - LDFLAGS = - -# SETTING: set linker flags for each binary type - ifeq ($(TYPE), APP) - LDFLAGS += -Xlinker -soname=_APP_ - else - ifeq ($(TYPE), SHARED) - LDFLAGS += -addon -Xlinker -soname=$(NAME) - else - ifeq ($(TYPE), DRIVER) - LDFLAGS += -nostdlib /boot/develop/lib/x86/_KERNEL_ - endif - endif - endif - -else - -# ppc Settings -ifeq ($(CPU), ppc) -# set the compiler and compiler flags - CC = mwcc - CFLAGS += - -# SETTING: set the proper optimization level - ifeq ($(OPTIMIZE), FULL) - OPTIMIZER = -O7 - else - ifeq ($(OPTIMIZE), SOME) - OPTIMIZER = -O3 - else - ifeq ($(OPTIMIZE), NONE) - OPTIMIZER = - endif - endif - endif - - CFLAGS += $(OPTIMIZER) - -# SETTING: set warning level - ifeq ($(WARNINGS), ALL) - CFLAGS += -w all - else - ifeq ($(WARNINGS), NONE) - CFLAGS += -w 0 - endif - endif - - # clear the standard environment variable - # now there are no standard libraries to link against - BELIBFILES= - -# set the linker and linker flags - LD = mwldppc - - ifeq ($(TYPE), APP) - LDFLAGS += - else - ifeq ($(TYPE), SHARED) - LDFLAGS += -xms - endif - endif - - ifeq ($(TYPE), DRIVER) - LDFLAGS += -nodefaults \ - -export all \ - -G \ - /boot/develop/lib/ppc/glue-noinit.a \ - /boot/develop/lib/ppc/_KERNEL_ - else - # override the standard environment variable - LDFLAGS += -export pragma \ - -init _init_routine_ \ - -term _term_routine_ \ - -lroot \ - /boot/develop/lib/ppc/glue-noinit.a \ - /boot/develop/lib/ppc/init_term_dyn.o \ - /boot/develop/lib/ppc/start_dyn.o - - endif - - -endif -endif - - -# psuedo-function for converting a list of source files in SRCS variable -# to a corresponding list of object files in $(OBJ_DIR)/xxx.o -# The "function" strips off the src file suffix (.ccp or .c or whatever) -# and then strips of the directory name, leaving just the root file name. -# It then appends the .o suffix and prepends the $(OBJ_DIR)/ path -define SRCS_LIST_TO_OBJS - $(addprefix $(OBJ_DIR)/, $(addsuffix .o, $(foreach file, $(SRCS), \ - $(basename $(notdir $(file)))))) -endef - -OBJS = $(SRCS_LIST_TO_OBJS) - -# create a unique list of paths to our sourcefiles -SRC_PATHS += $(sort $(foreach file, $(SRCS), $(dir $(file)))) - -# add source paths to VPATH if not already present -VPATH := -VPATH += $(addprefix :, $(subst ,:, $(filter-out $($(subst, :, ,$(VPATH))), $(SRC_PATHS)))) - -# add source paths and include paths to INLCUDES if not already present -INCLUDES = $(foreach path, $(INCPATHS) $(SRC_PATHS), $(addprefix -I, $(path))) - - -# SETTING: add the -L prefix to all library paths to search -LINK_PATHS = $(foreach path, $(LIBPATHS) $(SRC_PATHS) , \ - $(addprefix -L, $(path))) - -# SETTING: add the -l prefix to all libs to be linked against -LINK_LIBS = $(foreach lib, $(LIBS), $(addprefix -l, $(lib))) - -# add to the linker flags -LDFLAGS += $(LINK_PATHS) $(LINK_LIBS) - -# SETTING: add the defines to the compiler flags -CFLAGS += $(foreach define, $(DEFINES), $(addprefix -D, $(define))) - -# SETTING: use the archive tools if building a static library -# otherwise use the linker -ifeq ($(TYPE), STATIC) - BUILD_LINE = ar -cru $(NAME) $(OBJS) -else - BUILD_LINE = $(LD) -o $@ $(OBJS) $(LDFLAGS) -endif - -# create the resource instruction - ifeq ($(RSRCS), ) - DO_RSRCS := - else - DO_RSRCS := $(XRES) -o $(TARGET) $(RSRCS) - endif - - -# define the actual work to be done -default: $(TARGET) - -$(TARGET): $(OBJ_DIR) $(OBJS) $(RSRCS) ksocket_v3/libksocket/$(OBJ_DIR)/libksocket.a - $(BUILD_LINE) - $(DO_RSRCS) - $(MIMESET) -f $@ - - -# rule to create the object file directory if needed -$(OBJ_DIR):: - @[ -d $(OBJ_DIR) ] || mkdir $(OBJ_DIR) > /dev/null 2>&1 - -$(OBJ_DIR)/%.o : %.c - $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ -$(OBJ_DIR)/%.o : %.cpp - $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ -$(OBJ_DIR)/%.o : %.cp - $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ -$(OBJ_DIR)/%.o : %.C - $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ -$(OBJ_DIR)/%.o : %.CC - $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ -$(OBJ_DIR)/%.o : %.CPP - $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ - - -# empty rule. Things that depend on this rule will always get triggered -FORCE: - -# The generic clean command. Delete everything in the object folder. -clean :: FORCE - -rm -rf $(OBJ_DIR) - -# remove just the application from the object folder -rmapp :: - -rm -f $(TARGET) - -ksocket_v3/libksocket/$(OBJ_DIR)/libksocket.a :: FORCE - cd ksocket_v3/libksocket; make diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/nfs_add_on.c b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/nfs_add_on.c deleted file mode 100644 index f72aa53d6f..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/nfs_add_on.c +++ /dev/null @@ -1,1295 +0,0 @@ -#define _BUILDING_fs 1 - -#include "betalk.h" -#include "nfs_add_on.h" - -#include "ksocket.h" -#include -#include -#include -#include -#include -#include - -_EXPORT vnode_ops fs_entry = -{ - (op_read_vnode *) &fs_read_vnode, - (op_write_vnode *) &fs_write_vnode, - (op_remove_vnode *) &fs_remove_vnode, - (op_secure_vnode *) &fs_secure_vnode, - (op_walk *) &fs_walk, - (op_access *) &fs_access, - (op_create *) &fs_create, - (op_mkdir *) &fs_mkdir, - (op_symlink *) &fs_symlink, - NULL, // &fs_link, - (op_rename *) &fs_rename, - (op_unlink *) &fs_unlink, - (op_rmdir *) &fs_rmdir, - (op_readlink *) &fs_readlink, - (op_opendir *) &fs_opendir, - (op_closedir *) &fs_closedir, - (op_free_cookie *) &fs_free_dircookie, - (op_rewinddir *) &fs_rewinddir, - (op_readdir *) &fs_readdir, - (op_open *) &fs_open, - (op_close *) &fs_close, - (op_free_cookie *) &fs_free_cookie, - (op_read *) &fs_read, - (op_write *) &fs_write, - NULL, // &fs_readv - NULL, // &fs_writev - NULL, // &fs_ioctl, - NULL, // &fs_setflags, - (op_rstat *) &fs_rstat, - (op_wstat *) &fs_wstat, - NULL, // &fs_fsync, - NULL, // &fs_initialize, - (op_mount *) &fs_mount, - (op_unmount *) &fs_unmount, - NULL, // &fs_sync, - (op_rfsstat *) &fs_rfsstat, - (op_wfsstat *) &fs_wfsstat, - NULL, // &fs_select - NULL, // &fs_deselect - NULL, // (op_open_indexdir *) &fs_open_indexdir, - NULL, // (op_close_indexdir *) &fs_close_indexdir, - NULL, // (op_free_cookie *) &fs_free_indexdircookie, - NULL, // (op_rewind_indexdir *) &fs_rewind_indexdir, - NULL, // (op_read_indexdir *) &fs_read_indexdir, - NULL, // (op_create_index *) &fsCreateIndex, - NULL, // (op_remove_index *) &fsRemoveIndex, - NULL, // &fs_rename_index, - NULL, // (op_stat_index *) &fsStatIndex, - (op_open_attrdir *) &fs_open_attribdir, - (op_close_attrdir *) &fs_close_attribdir, - (op_free_cookie *) &fs_free_attribdircookie, - (op_rewind_attrdir *) &fs_rewind_attribdir, - (op_read_attrdir *) &fs_read_attribdir, - (op_write_attr *) &fs_write_attrib, - (op_read_attr *) &fs_read_attrib, - (op_remove_attr *) &fs_remove_attrib, - NULL, // &fs_rename_attrib, - (op_stat_attr *) &fs_stat_attrib, - (op_open_query *) &fsOpenQuery, - (op_close_query *) &fsCloseQuery, - (op_free_cookie *) &fsFreeQueryCookie, - (op_read_query *) &fsReadQuery -}; - -_EXPORT int32 api_version = B_CUR_FS_API_VERSION; - - -extern btFileHandle handle_from_vnid(fs_nspace *ns, vnode_id vnid) -{ - fs_node *current; - - while (acquire_sem(ns->sem) == B_INTERRUPTED); - - current = ns->first; - while (current && current->vnid != vnid) - current = current->next; - - release_sem(ns->sem); - - return current->fhandle; -} - -btFileHandle *create_node(fs_nspace *ns, btFileHandle *dir, btFileHandle *file, char *name, vnode_id vnid) -{ - fs_node *newNode = (fs_node *) malloc(sizeof(fs_node)); - if (newNode) - { -// newNode->dhandle = *dir; - newNode->fhandle = *file; -// strcpy(newNode->name, name); - newNode->vnid = vnid; - - insert_node(ns, newNode); - } - return newNode; -} - -void insert_node(fs_nspace *ns, fs_node *node) -{ - fs_node *current; - - while (acquire_sem(ns->sem) == B_INTERRUPTED); - - current = ns->first; - while (current && current->vnid != node->vnid) - current = current->next; - - if (current) - free(node); - else - { - node->next = ns->first; - ns->first = node; - } - - release_sem(ns->sem); -} - -void remove_node(fs_nspace *ns, vnode_id vnid) -{ - fs_node *current; - fs_node *previous; - - while (acquire_sem(ns->sem) == B_INTERRUPTED); - - current = ns->first; - previous = NULL; - - while (current && current->vnid != vnid) - { - previous = current; - current = current->next; - } - - if (current) - { - if (previous) - previous->next = current->next; - else - ns->first = current->next; - - free(current); - } - - release_sem(ns->sem); -} - -// fs_read_vnode() -// -// Description: Allocate resources required to load the specified vnid. Also returns -// a reference to the vnode via the supplied pointer. -// -// Parameters: -// ns (in): Private file system structure -// vnid (in): vnid of the vnode to load -// r (in): ?? -// node (out): A reference to the vnode loaded -// -// Returns: -// B_OK if everything is successful, or -// EINVAL if the specified vnid is not found -// -extern int fs_read_vnode(fs_nspace *ns, vnode_id vnid, char r, fs_node **node) -{ - fs_node *current; - - *node = NULL; - - // If we need to acquire the semaphone to search the list, do so now. - if (!r) - while (acquire_sem(ns->sem) == B_INTERRUPTED); - - current = ns->first; - while (current && current->vnid != vnid) - current = current->next; - - // TODO: shouldn't we release the semaphore here? - // If the specified parameter is non-null, then return the node we found. - if (current && node) - *node = current; - - // Release the semaphore if necessary. - if (!r) - release_sem(ns->sem); - - return (current ? B_OK : EINVAL); -} - -// fs_write_vnode() -// -// Description: Free resources allocated with the sister function fs_read_vnode(). -// Parameters: -// ns (in): Private file system structure -// node (in): Node that can be freed -// r (in): ?? -// Returns: -// B_OK if everything is successful (always in our case) -// -extern int fs_write_vnode(fs_nspace *ns, fs_node *node, char r) -{ - // In our case, there aren't any resources to free, so there isn't anything - // for this function to do but return successfully. - return B_OK; -} - -// fs_walk() -// -// Description: This function is the single file system location where a path is -// traversed by name. Given a directory handle and a file name, this function returns -// the vnid of the file if it indeed exists. -// -// Parameters: -// ns (in): Private file system structure -// base (in): File handle of the directory to look in -// file (in): Name of the file to look for -// newpath (out): Name of the real file if the given file is a symbolic link -// vnid (out): Vnid of the file given by "file" -// -// Returns: -// B_OK if everything is successful, -// Otherwise an error code detailing the problem -// -extern int fs_walk(fs_nspace *ns, fs_node *base, const char *file, char **newpath, vnode_id *vnid) -{ - bool isLink; - fs_node *dummy; - status_t result; - - // If the file specified is the current directory, then that parameter provides - // the necessary vnid. Also note that the current directory entry cannot be a - // symbolic link. - if (!strcmp(".", file)) - { - *vnid = base->vnid; - isLink = false; - } - else - { - btFileHandle fhandle; - struct stat st; - status_t result; - - // Look up the requested entry, getting the stat structure and file handle - // filled in. - if ((result = btLookup(ns->s, &base->fhandle, file, &fhandle, &st)) != B_OK) - return result; - - // The vnid is the resulting file's inode. Once this is established, insert - // the new node in our list. - if (create_node(ns, NULL, &fhandle, NULL, st.st_ino) == NULL) - return ENOMEM; - - *vnid = st.st_ino; - isLink = S_ISLNK(st.st_mode); - } - - if ((result = get_vnode(ns->nsid, *vnid, (void **) &dummy)) < B_OK) - return result; - - // If we've found a symbolic link, and the supplied character pointer is non-null, - // then the vnode layer is looking for the actual path. - if (isLink && newpath) - { - char path[B_PATH_NAME_LENGTH + 1]; - size_t pathLen = B_PATH_NAME_LENGTH; - - if ((result = fs_readlink(ns, dummy, path, &pathLen)) < B_OK) - { - put_vnode(ns->nsid, *vnid); - return result; - } - - path[pathLen] = 0; - result = new_path(path, newpath); - - if (result < B_OK) - { - put_vnode(ns->nsid, *vnid); - return result; - } - - return put_vnode(ns->nsid, *vnid); - } - - return B_OK; -} - -// fs_opendir() -// -extern int fs_opendir(fs_nspace *ns, fs_node *node, btCookie **cookie) -{ - struct stat st; - btFileHandle fhandle; - status_t result; - - // Do a basic stat() on this file to verify we indeed have a directory. - // If we cannot obtain this information, we have an even bigger problem. - if ((result = btStat(ns->s, &node->fhandle, &st)) < B_OK) - return result; - - // Now that we have the right information, verify we're looking at a directory. - if (!S_ISDIR(st.st_mode)) - return ENOTDIR; - - // Allocate and initialize the cookie. - *cookie = (btCookie *) malloc(sizeof(btCookie)); - if (!*cookie) - return ENOMEM; - - memset((*cookie)->opaque, 0, BT_COOKIE_SIZE); - (*cookie)->lpbCache = false; - (*cookie)->eof = false; - - return B_OK; -} - -// fs_closedir() -// -extern int fs_closedir(fs_nspace *ns, fs_node *node, btCookie *cookie) -{ - btEmptyLPBCache(cookie); - return B_OK; -} - -// fs_rewinddir() -// -extern int fs_rewinddir(fs_nspace *ns, fs_node *node, btCookie *cookie) -{ - memset(cookie->opaque, 0, BT_COOKIE_SIZE); - cookie->eof = false; - btEmptyLPBCache(cookie); - return B_OK; -} - -// fs_readdir() -// -extern int fs_readdir(fs_nspace *ns, fs_node *node, btCookie *cookie, long *num, struct dirent *buf, size_t bufsize) -{ - btFileHandle fhandle; - struct stat st; - status_t result; - vnode_id vnid; - char *filename; - long max, bufContent; - int32 value; - - max = *num; - *num = 0; - - // Cause the directory to be read. - while ((result = btReadDir(ns->s, &node->fhandle, &vnid, &filename, cookie, &fhandle, &st)) == B_OK) - { - if (strcmp(filename, ".") && strcmp(filename, "..")) - { - fs_node *newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->vnid = vnid; - memcpy(&newNode->fhandle, &fhandle, BT_FILE_HANDLE_SIZE); - - insert_node (ns, newNode); - - bufContent = 2 * (sizeof(dev_t) + sizeof(ino_t)) + sizeof(unsigned short) + strlen(filename) + 1; - if (bufsize < bufContent) - return B_OK; - - buf->d_dev = ns->nsid; - buf->d_pdev = ns->nsid; - buf->d_ino = vnid; - buf->d_pino = node->vnid; - buf->d_reclen = bufContent; - strcpy(buf->d_name, filename); - - bufsize -= bufContent; - buf = (struct dirent *)((char *) buf + bufContent); - - (*num)++; - } - - free(filename); - - if (*num == max) - return B_OK; - } - - return B_OK; -} - -// fs_free_dircookie() -// -extern int fs_free_dircookie(fs_nspace *ns, fs_node *node, btCookie *cookie) -{ - if (cookie) - { - btEmptyLPBCache(cookie); - free(cookie); - } - - return B_OK; -} - -// fs_rstat() -// -extern int fs_rstat(fs_nspace *ns, fs_node *node, struct stat *st) -{ - btFileHandle fhandle; - status_t result; - - // This was btGetAttr(), but isn't that just btStat()? - if ((result = btStat(ns->s, &node->fhandle, st)) < B_OK) - return result; - - st->st_dev = ns->nsid; - return B_OK; -} - -// fs_mount() -// -extern int fs_mount(nspace_id nsid, const char *devname, ulong flags, struct mount_bt_params *parms, size_t len, fs_nspace **data, vnode_id *vnid) -{ - status_t result; - fs_nspace *ns; - fs_node *rootNode; - struct stat st; - - // If we didn't receive any mount parameters, we won't know the server to connect to, - // or the folder to be shared. - if (parms == NULL) - return EINVAL; - - // Initialize the ksocket library for kernel-based network communication. - if ((result = ksocket_init()) < B_OK) - return result; - - // Allocate our private file system information block. - ns = (fs_nspace *) malloc(sizeof(fs_nspace)); - ns->nsid = nsid; - - // Copy over the parameters specified, including the server, folder, user and group - // IDs, and so on. - ns->params.serverIP = parms->serverIP; - ns->params.server = strdup(parms->server); - ns->params.export = strdup(parms->export); - ns->params.uid = parms->uid; - ns->params.gid = parms->gid; - ns->params.hostname = strdup(parms->hostname); - ns->params.folder = strdup(parms->folder); - - // Now connect to the remote server. The socket returned will be used for all future - // communication with that server. - ns->s = btConnect(ns->params.serverIP, BT_TCPIP_PORT); - if (ns->s != INVALID_SOCKET) - { - ns->xid=0; - - btRPCInit(ns); - - // Create a semaphore for exclusive access to the vnode list when we need to scan - // for a particular vnode. - ns->sem = create_sem(1, "bt_sem"); - if (ns->sem > 0) - { - // The system should own this semaphore. - set_sem_owner(ns->sem, B_SYSTEM_TEAM); - - // Allocate the root node. - rootNode = (fs_node *) malloc(sizeof(fs_node)); - rootNode->next = NULL; - - // Let the server know we are mounting the exported folder. This operation - // will return the root node file handle. - result = btMount(ns->s, ns->params.export, &rootNode->fhandle); - if (result == B_OK) - { - // This was btGetAttr() - result = btStat(ns->s, &rootNode->fhandle, &st); - if (result == B_OK) - { - ns->rootid = st.st_ino; - rootNode->vnid = ns->rootid; - *vnid = ns->rootid; - - result = new_vnode(nsid, *vnid, rootNode); - if (result == B_OK) - { - *data = ns; - ns->first = rootNode; - notify_listener(B_DEVICE_MOUNTED, ns->nsid, 0, 0, 0, NULL); - return B_OK; - } - } - } - - // We've failed. The first step is to free the root node we allocated, and - // release the semaphore we created as well. - free(rootNode); - delete_sem(ns->sem); - } - - // Disconnect from the server. - btDisconnect(ns->s); - btRPCClose(); - } - else - result = EHOSTUNREACH; - - // De-allocate our private file system structure and all the string space we duplicated - // on startup. - free(ns->params.hostname); - free(ns->params.export); - free(ns->params.server); - free(ns); - - ksocket_cleanup(); - return result; -} - -extern int fs_unmount(fs_nspace *ns) -{ - notify_listener(B_DEVICE_UNMOUNTED, ns->nsid, 0, 0, 0, NULL); - - btDisconnect(ns->s); - btRPCClose(); - - free(ns->params.hostname); - free(ns->params.export); - free(ns->params.server); - - while (acquire_sem(ns->sem) == B_INTERRUPTED); - - while (ns->first) - { - fs_node *next = ns->first->next; - free(ns->first); - ns->first = next; - } - - release_sem(ns->sem); - delete_sem(ns->sem); - - ns->s = INVALID_SOCKET; - free(ns); - ksocket_cleanup(); - - return B_OK; -} - -// fs_rfsstat() -// -extern int fs_rfsstat(fs_nspace *ns, struct fs_info *info) -{ - btFileHandle rootHandle = handle_from_vnid(ns, ns->rootid); - bt_fsinfo fsinfo; - int result; - - result = btGetFSInfo(ns->s, &rootHandle, &fsinfo); - if (result == B_OK) - { - info->dev = ns->nsid; - info->root = ns->rootid; - info->flags = B_FS_IS_SHARED | B_FS_IS_PERSISTENT | - B_FS_HAS_MIME | B_FS_HAS_ATTR | B_FS_HAS_QUERY; - info->block_size = fsinfo.blockSize; - info->io_size = 8192; - info->total_blocks = fsinfo.totalBlocks; - info->free_blocks = fsinfo.freeBlocks; - info->total_nodes = 100; - info->free_nodes = 100; - strcpy(info->device_name, "BeServed_Share"); - strcpy(info->volume_name, ns->params.folder); - strcpy(info->fsh_name, "bt_fsh"); - } - - return result; -} - -// fs_open() -// -extern int fs_open(fs_nspace *ns, fs_node *node, int omode, fs_file_cookie **cookie) -{ - struct stat st; - btFileHandle fhandle; - status_t result; - - // This was btGetAttr() - if ((result = btStat(ns->s, &node->fhandle, &st)) < B_OK) - return result; - - if (S_ISDIR(st.st_mode)) - { - *cookie = NULL; - return B_OK; // permit opening of directories - } - - *cookie = (fs_file_cookie *) malloc(sizeof(fs_file_cookie)); - (*cookie)->omode = omode; - (*cookie)->original_size = st.st_size; - (*cookie)->st = st; - - return B_OK; -} - -// fs_close() -// -extern int fs_close(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie) -{ - if (cookie && (cookie->omode & O_RDWR || cookie->omode & O_WRONLY)) - return notify_listener(B_STAT_CHANGED, ns->nsid, 0, 0, node->vnid, NULL); - - return B_OK; -} - -// fs_free_cookie() -// -extern int fs_free_cookie(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie) -{ - if (cookie) - free(cookie); - - return B_OK; -} - -// fs_read() -// -extern int fs_read(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie, off_t pos, void *buf, size_t *len) -{ - if (!len) - return B_ERROR; - - // If we weren't given proper file system or vnode pointers, something is awry. - if (!ns || !node || !buf) - return B_ERROR; - - // Do not permit reading directories. - if (!cookie) - return EISDIR; - - *len = btRead(ns->s, &node->fhandle, pos, *len, buf); - - return B_OK; -} - -extern int fs_write(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie, off_t pos, const void *buf, size_t *len) -{ - // Do not permit writing directories. - if (!cookie) - return EISDIR; - - if (cookie->omode & O_APPEND) - pos += cookie->original_size; - - *len = btWrite(ns->s, &node->fhandle, pos, *len, buf); - btStat(ns->s, &node->fhandle, &cookie->st); - - return B_OK; -} - -extern int fs_wstat(fs_nspace *ns, fs_node *node, struct stat *st, long mask) -{ - int error = btWStat(ns->s, &node->fhandle, st, mask); - if (error != B_OK) - return error; - - return notify_listener(B_STAT_CHANGED, ns->nsid, 0, 0, node->vnid, NULL); -} - -extern int fs_wfsstat(fs_nspace *ns, struct fs_info *info, long mask) -{ - return B_OK; -} - -extern int fs_create(fs_nspace *ns, fs_node *dir, const char *name, int omode, int perms, vnode_id *vnid, - fs_file_cookie **cookie) -{ - btFileHandle fhandle; - struct stat st; - status_t result; - int error; - - result = btLookup(ns->s, &dir->fhandle, name, &fhandle, &st); - - if (result == B_OK) - { - void *dummy; - fs_node *newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->fhandle = fhandle; - newNode->vnid = st.st_ino; - insert_node(ns, newNode); - - *vnid = st.st_ino; - - if ((result = get_vnode(ns->nsid, *vnid, &dummy)) < B_OK) - return result; - - if (S_ISDIR(st.st_mode)) - return EISDIR; - - if (omode & O_EXCL) - return EEXIST; - - if (omode & O_TRUNC) - if ((result = btTruncate(ns->s, &fhandle, 0L)) < B_OK) - return result; - - *cookie = (fs_file_cookie *) malloc(sizeof(fs_file_cookie)); - (*cookie)->omode = omode; - (*cookie)->original_size = st.st_size; - (*cookie)->st = st; - - return B_OK; - } - else if (result != ENOENT) - return result; - else - { - uint8 *replyBuf; - int32 status; - fs_node *newNode; - - // If the file doesn't exist, it may have previously and another user has - // deleted it. If so, our vnode layer will still have the old vnid registered - // and will panic when it gets a new one. Let's make sure the old one, if - // any, is unregistered. - - if (!(omode & O_CREAT)) - return ENOENT; - - error = btCreate(ns->s, &dir->fhandle, name, &fhandle, omode, perms, &st); - if (error != B_OK) - return error; - - newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->fhandle = fhandle; - newNode->vnid = st.st_ino; - insert_node(ns, newNode); - - *vnid = st.st_ino; - *cookie = (fs_file_cookie *) malloc(sizeof(fs_file_cookie)); - (*cookie)->omode = omode; - (*cookie)->original_size = st.st_size; - (*cookie)->st = st; - - result = new_vnode(ns->nsid, *vnid, newNode); - if (result < B_OK) - return result; - - return notify_listener(B_ENTRY_CREATED, ns->nsid, dir->vnid, 0, *vnid, name); - } -} - -extern int fs_unlink(fs_nspace *ns, fs_node *dir, const char *name) -{ - fs_node *newNode; - fs_node *dummy; - struct stat st; - btFileHandle fhandle; - int error; - - error = btLookup(ns->s, &dir->fhandle, name, &fhandle, &st); - if (error != B_OK) - return error; - - newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->fhandle = fhandle; - newNode->vnid = st.st_ino; - insert_node(ns, newNode); - - error = get_vnode(ns->nsid, st.st_ino, (void **) &dummy); - if (error != B_OK) - return error; - - if (!S_ISREG(st.st_mode) && !S_ISLNK(st.st_mode)) - return EISDIR; - - error = remove_vnode(ns->nsid, st.st_ino); - if (error != B_OK) - return error; - - error = put_vnode(ns->nsid, st.st_ino); - if (error != B_OK) - return error; - - error = btUnlink(ns->s, &dir->fhandle, name); - if (error != B_OK) - return error; - - return notify_listener(B_ENTRY_REMOVED, ns->nsid, dir->vnid, 0, st.st_ino, name); -} - -extern int fs_remove_vnode(fs_nspace *ns, fs_node *node, char r) -{ - remove_node(ns, node->vnid); - return B_OK; -} - -// fs_secure_vnode() -// -// Description: Given a node, this function determines whether the user has the -// required permission to access it. This is currently unimplemented in BFS, and -// we consequently dismiss it here as well. -// -extern int fs_secure_vnode(fs_nspace *ns, fs_node *node) -{ - return B_OK; -} - -extern int fs_mkdir(fs_nspace *ns, fs_node *dir, const char *name, int perms) -{ - btFileHandle dhandle, fhandle; - fs_node *newNode; - struct stat st; - int error; - - error = btLookup(ns->s, &dir->fhandle, name, &dhandle, &st); - if (error == B_OK) - { - void *dummy; - error = get_vnode(ns->nsid, st.st_ino, &dummy); - if (error != B_OK) - return error; - - return EEXIST; - } - else if (error != ENOENT) - return error; - - error = btCreateDir(ns->s, &dir->fhandle, name, perms | S_IFDIR, &fhandle, &st); - if (error != B_OK) - return error; - - newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->fhandle = fhandle; - newNode->vnid = st.st_ino; - insert_node(ns, newNode); - - return notify_listener(B_ENTRY_CREATED, ns->nsid, dir->vnid, 0, st.st_ino, name); -} - -extern int fs_rename(fs_nspace *ns, fs_node *olddir, const char *oldname, fs_node *newdir, const char *newname) -{ - btFileHandle fhandle; - struct stat st; - int error; - - error = btLookup(ns->s, &newdir->fhandle, newname, &fhandle, &st); - if (error == B_OK) - { - if (S_ISREG(st.st_mode)) - error = fs_unlink(ns, newdir, newname); - else - error = fs_rmdir(ns, newdir, newname); - - if (error != B_OK) - return error; - } - - error = btLookup(ns->s, &olddir->fhandle, oldname, &fhandle, &st); - if (error != B_OK) - return error; - - error = btRename(ns->s, &olddir->fhandle, oldname, &newdir->fhandle, newname); - if (error != B_OK) - return error; - - return notify_listener(B_ENTRY_MOVED, ns->nsid, olddir->vnid, newdir->vnid, st.st_ino, newname); -} - -extern int fs_rmdir(fs_nspace *ns, fs_node *dir, const char *name) -{ - fs_node *newNode; - fs_node *dummy; - btFileHandle fhandle; - struct stat st; - int error; - - error = btLookup(ns->s, &dir->fhandle, name, &fhandle, &st); - if (error != B_OK) - return error; - - newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->fhandle = fhandle; - newNode->vnid = st.st_ino; - insert_node(ns, newNode); - - error = get_vnode(ns->nsid, st.st_ino, (void **) &dummy); - if (error != B_OK) - return error; - - if (!S_ISDIR(st.st_mode)) - return ENOTDIR; - - error = remove_vnode(ns->nsid, st.st_ino); - if (error != B_OK) - return error; - - error = put_vnode(ns->nsid, st.st_ino); - if (error != B_OK) - return error; - - error = btDeleteDir(ns->s, &dir->fhandle, name); - if (error != B_OK) - return error; - - return notify_listener(B_ENTRY_REMOVED, ns->nsid, dir->vnid, 0, st.st_ino, name); -} - -extern int fs_readlink(fs_nspace *ns, fs_node *node, char *buf, size_t *bufsize) -{ - return btReadLink(ns->s, &node->fhandle, buf, bufsize); -} - -extern int fs_symlink(fs_nspace *ns, fs_node *dir, const char *name, const char *path) -{ - btFileHandle fhandle; - fs_node *newNode; - struct stat st; - int error; - - error = btLookup(ns->s, &dir->fhandle, name, &fhandle, &st); - if (error == B_OK) - { - void *dummy; - if ((error = get_vnode(ns->nsid, st.st_ino, &dummy)) < B_OK) - return error; - - return EEXIST; - } - else if (error != ENOENT) - return error; - - error = btSymLink(ns->s, &dir->fhandle, name, path); - if (error != B_OK) - return error; - - error = btLookup(ns->s, &dir->fhandle, name, &fhandle, &st); - if (error != B_OK) - return error; - - newNode = (fs_node *) malloc(sizeof(fs_node)); - newNode->fhandle = fhandle; - newNode->vnid = st.st_ino; - insert_node(ns, newNode); - - error = notify_listener(B_ENTRY_CREATED, ns->nsid, dir->vnid, 0, st.st_ino, name); - return error; -} - -// fs_access() -// -// Description: This function implements the access() system call. -// -int fs_access(void *ns, void *node, int mode) -{ - return B_OK; -} - -int fs_read_attrib(fs_nspace *ns, fs_node *node, const char *name, int type, void *buf, size_t *len, off_t pos) -{ - int bytes; - - // Automatically deny reading Tracker attributes. - if (strncmp(name, "_trk/", 5) == 0) - { - errno = B_ENTRY_NOT_FOUND; - return -1; - } - - bytes = btReadAttrib(ns->s, &node->fhandle, name, type, buf, *len, pos); - if (bytes == -1) - return -1; - - *len = bytes; - return B_OK; -} - -int fs_write_attrib(fs_nspace *ns, fs_node *node, const char *name, int type, const void *buf, size_t *len, off_t pos) -{ - int bytes; - - // Automatically deny reading Tracker attributes. - if (strncmp(name, "_trk/", 5) == 0) - { - errno = B_ENTRY_NOT_FOUND; - return -1; - } - - bytes = btWriteAttrib(ns->s, &node->fhandle, name, type, buf, *len, pos); - if (bytes == -1) - return -1; - - *len = bytes; - notify_listener(B_ATTR_CHANGED, ns->nsid, 0, 0, node->vnid, NULL); - return B_OK; -} - -// fs_open_attribdir() -// -extern int fs_open_attribdir(fs_nspace *ns, fs_node *node, btCookie **cookie) -{ - struct stat st; - int error; - - // Do a basic stat() on this file to verify we indeed have a valid file. - // If we cannot obtain this information, we have an even bigger problem. - if ((error = btStat(ns->s, &node->fhandle, &st)) < B_OK) - return error; - - // Allocate and initialize the cookie. - *cookie = (btCookie *) malloc(sizeof(btCookie)); - if (!*cookie) - return ENOMEM; - - memset((*cookie)->opaque, 0, BT_COOKIE_SIZE); - (*cookie)->lpbCache = false; - (*cookie)->eof = false; - - return B_OK; -} - -// fs_close_attribdir() -// -extern int fs_close_attribdir(fs_nspace *ns, fs_node *node, btCookie *cookie) -{ - btEmptyLPBCache(cookie); - return B_OK; -} - -// fs_rewind_attribdir() -// -extern int fs_rewind_attribdir(fs_nspace *ns, fs_node *node, btCookie *cookie) -{ - if (cookie) - { - memset(cookie->opaque, 0, BT_COOKIE_SIZE); - btEmptyLPBCache(cookie); - cookie->eof = false; - } - - return B_OK; -} - -extern int fs_read_attribdir(fs_nspace *ns, fs_node *node, btCookie *cookie, long *num, struct dirent *buf, size_t bufsize) -{ - status_t result; - char *attrName; - long max; - - max = *num; - *num = 0; - - // Cause the directory to be read. - while ((result = btReadAttribDir(ns->s, &node->fhandle, &attrName, cookie)) == B_OK) - { - if (strncmp(attrName, "_trk/", 5) != 0) - { - if (bufsize < 2 * (sizeof(dev_t) + sizeof(ino_t)) + sizeof(unsigned short) + strlen(attrName) + 1) - return B_OK; - - buf->d_dev = 0; - buf->d_pdev = 0; - buf->d_ino = 0; - buf->d_pino = 0; - buf->d_reclen = 2 * (sizeof(dev_t) + sizeof(ino_t)) + sizeof(unsigned short) + strlen(attrName) + 1; - strcpy(buf->d_name, attrName); - - bufsize -= buf->d_reclen; - buf = (struct dirent *)((char *) buf + buf->d_reclen); - - (*num)++; - } - - free(attrName); - - if (*num == max) - return B_OK; - } - - return B_OK; -} - -// fs_free_attribdircookie() -// -extern int fs_free_attribdircookie(fs_nspace *ns, btCookie *cookie) -{ -// if (cookie) -// { -// btEmptyLPBCache(cookie); -// free(cookie); -// } - - return B_OK; -} - -// fs_remove_attrib() -// -extern int fs_remove_attrib(fs_nspace *ns, fs_node *node, const char *name) -{ - // Automatically deny removing Tracker attributes. - if (strncmp(name, "_trk/", 5) == 0) - { - errno = B_ENTRY_NOT_FOUND; - return -1; - } - - return btRemoveAttrib(ns->s, &node->fhandle, name); -} - -// fs_stat_attrib() -// -extern int fs_stat_attrib(fs_nspace *ns, fs_node *node, const char *name, struct attr_info *buf) -{ - buf->type = 0; - buf->size = 0; - - // Automatically deny reading Tracker attributes. - if (strncmp(name, "_trk/", 5) == 0) - { - errno = B_ENTRY_NOT_FOUND; - return -1; - } - - return btStatAttrib(ns->s, &node->fhandle, name, buf); -} - -// fs_open_indexdir() -// -extern int fs_open_indexdir(fs_nspace *ns, btCookie **cookie) -{ - // Allocate and initialize the cookie. - *cookie = (btCookie *) malloc(sizeof(btCookie)); - memset ((*cookie)->opaque, 0, BT_COOKIE_SIZE); - (*cookie)->eof = false; - - return B_OK; -} - -// fs_close_indexdir() -// -extern int fs_close_indexdir(fs_nspace *ns, btCookie *cookie) -{ - return B_OK; -} - -// fs_rewind_indexdir() -// -extern int fs_rewind_indexdir(fs_nspace *ns, btCookie *cookie) -{ - memset(cookie->opaque, 0, BT_COOKIE_SIZE); - cookie->eof = false; - return B_OK; -} - -// fs_read_indexdir() -// -extern int fs_read_indexdir(fs_nspace *ns, btCookie *cookie, long *num, struct dirent *buf, size_t bufsize) -{ - status_t result; - char indexName[100]; - long max; - - max = *num; - *num = 0; - - // Cause the directory to be read. - while ((result = btReadIndexDir(ns->s, indexName, sizeof(indexName) - 1, cookie)) == B_OK) - { - if (bufsize < 2 * (sizeof(dev_t) + sizeof(ino_t)) + sizeof(unsigned short) + strlen(indexName) + 1) - return B_OK; - - buf->d_dev = 0; - buf->d_pdev = 0; - buf->d_ino = 0; - buf->d_pino = 0; - buf->d_reclen = 2 * (sizeof(dev_t) + sizeof(ino_t)) + sizeof(unsigned short) + strlen(indexName) + 1; - strcpy(buf->d_name, indexName); - - bufsize -= buf->d_reclen; - buf = (struct dirent *)((char *) buf + buf->d_reclen); - - (*num)++; - - if (*num == max) - return B_OK; - } - - return B_OK; -} - -// fs_free_indexdircookie() -// -extern int fs_free_indexdircookie(fs_nspace *ns, btCookie *cookie) -{ - if (cookie) - free(cookie); - - return B_OK; -} - -extern int fsCreateIndex(fs_nspace *ns, const char *name, int type, int flags) -{ - return btCreateIndex(ns->s, name, type, flags); -} - -extern int fsRemoveIndex(fs_nspace *ns, const char *name) -{ - return btRemoveIndex(ns->s, name); -} - -extern int fsStatIndex(fs_nspace *ns, const char *name, struct index_info *buf) -{ - buf->type = 0; - buf->size = 0; - buf->modification_time = 0; - buf->creation_time = 0; - buf->uid = 0; - buf->gid = 0; - - return btStatIndex(ns->s, name, buf); -} - -extern int fsOpenQuery(fs_nspace *ns, const char *query, ulong flags, port_id port, long token, btQueryCookie **cookie) -{ - // Allocate and initialize the cookie. - *cookie = (btQueryCookie *) malloc(sizeof(btQueryCookie)); - memset ((*cookie)->opaque, 0, BT_COOKIE_SIZE); - (*cookie)->query = strdup(query); - - return B_OK; -} - -extern int fsCloseQuery(fs_nspace *ns, btQueryCookie *cookie) -{ - return B_OK; -} - -extern int fsReadQuery(fs_nspace *ns, btQueryCookie *cookie, long *num, struct dirent *buf, size_t bufsize) -{ - char *filename; - vnode_id vnid; - long max, bufContent; - - max = *num; - *num = 0; - - while (btReadQuery(ns->s, &filename, &vnid, cookie) == B_OK) - { - bufContent = 2 * (sizeof(dev_t) + sizeof(ino_t)) + sizeof(unsigned short) + strlen(filename) + 1; - if (bufsize < bufContent) - return B_OK; - - buf->d_dev = ns->nsid; - buf->d_pdev = ns->nsid; - buf->d_ino = vnid; - buf->d_pino = vnid; - buf->d_reclen = bufContent; - strcpy(buf->d_name, filename); - - bufsize -= bufContent; - buf = (struct dirent *)((char *) buf + bufContent); - - free(filename); - - (*num)++; - if (*num == max) - return B_OK; - } - - return B_OK; -} - -extern int fsFreeQueryCookie(fs_nspace *ns, btQueryCookie *cookie) -{ - if (cookie) - { - if (cookie->query) - free(cookie->query); - - free(cookie); - } - - return B_OK; -} diff --git a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/nfs_add_on.h b/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/nfs_add_on.h deleted file mode 100644 index 34108a6f00..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/bt_fs/backups/nfs_add_on.h +++ /dev/null @@ -1,140 +0,0 @@ -#ifndef _NFS_ADD_ON_H -#define _NFS_ADD_ON_H - -#include "fsproto.h" -#include "betalk.h" - -#include -#include -#include - -struct mount_bt_params -{ - unsigned int serverIP; - char *server; - char *export; - uid_t uid; - gid_t gid; - char *hostname; -}; - -struct fs_node -{ - vnode_id vnid; - struct btFileHandle fhandle; - struct fs_node *next; -}; - -struct fs_nspace -{ - nspace_id nsid; - - thread_id tid; - bool quit; - int s; - - struct sockaddr_in mountAddr,nfsAddr; - - int32 xid; - - vnode_id rootid; - - sem_id sem; - struct fs_node *first; - - struct mount_bt_params params; -}; - -struct fs_file_cookie -{ - int omode; - off_t original_size; - struct stat st; -}; - -typedef struct fs_nspace fs_nspace; -typedef struct fs_node fs_node; -typedef struct fs_file_cookie fs_file_cookie; - -int fs_read_vnode(fs_nspace *ns, vnode_id vnid, char r, fs_node **node); -int fs_write_vnode(fs_nspace *ns, fs_node *node, char r); - -int fs_walk(fs_nspace *ns, fs_node *base, const char *file, char **newpath, - vnode_id *vnid); - -int fs_opendir(fs_nspace *ns, fs_node *node, btCookie **cookie); -int fs_closedir(fs_nspace *ns, fs_node *node, btCookie *cookie); -int fs_rewinddir(fs_nspace *ns, fs_node *node, btCookie *cookie); -int fs_readdir(fs_nspace *ns, fs_node *node, btCookie *cookie, long *num, - struct dirent *buf, size_t bufsize); - -int fs_free_dircookie(fs_nspace *ns, fs_node *node, btCookie *cookie); -int fs_rstat(fs_nspace *ns, fs_node *node, struct stat *); -int fs_mount(nspace_id nsid, const char *devname, ulong flags, - struct mount_bt_params *parms, size_t len, fs_nspace **data, vnode_id *vnid); -int fs_unmount(fs_nspace *ns); -int fs_rfsstat(fs_nspace *ns, struct fs_info *); - -int fs_open(fs_nspace *ns, fs_node *node, int omode, fs_file_cookie **cookie); -int fs_close(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie); -int fs_free_cookie(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie); -int fs_read(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie, off_t pos, void *buf, - size_t *len); - -int fs_write(fs_nspace *ns, fs_node *node, fs_file_cookie *cookie, off_t pos, - const void *buf, size_t *len); - -int fs_wstat(fs_nspace *ns, fs_node *node, struct stat *, long mask); -int fs_wfsstat(fs_nspace *ns, struct fs_info *, long mask); -int fs_create(fs_nspace *ns, fs_node *dir, const char *name, - int omode, int perms, vnode_id *vnid, fs_file_cookie **cookie); - -int fs_unlink(fs_nspace *ns, fs_node *dir, const char *name); -int fs_remove_vnode(fs_nspace *ns, fs_node *node, char r); -int fs_secure_vnode(fs_nspace *ns, fs_node *node); - -int fs_mkdir(fs_nspace *ns, fs_node *dir, const char *name, int perms); - -int fs_rename(fs_nspace *ns, fs_node *olddir, const char *oldname, - fs_node *newdir, const char *newname); - -int fs_rmdir(fs_nspace *ns, fs_node *dir, const char *name); -int fs_readlink(fs_nspace *ns, fs_node *node, char *buf, size_t *bufsize); - -int fs_symlink(fs_nspace *ns, fs_node *dir, const char *name, - const char *path); - -btFileHandle handle_from_vnid (fs_nspace *ns, vnode_id vnid); - -extern status_t bt_getattr(fs_nspace *ns, const btFileHandle *fhandle, struct stat *st); -extern void insert_node(fs_nspace *ns, fs_node *node); -extern void remove_node(fs_nspace *ns, vnode_id vnid); - -extern int fs_access(void *ns, void *node, int mode); - -extern int fs_read_attrib(fs_nspace *ns, fs_node *node, const char *name, int type, void *buf, size_t *len, off_t pos); -extern int fs_write_attrib(fs_nspace *ns, fs_node *node, const char *name, int type, const void *buf, size_t *len, off_t pos); -extern int fs_open_attribdir(fs_nspace *ns, fs_node *node, btCookie **cookie); -extern int fs_close_attribdir(fs_nspace *ns, fs_node *node, btCookie *cookie); -extern int fs_rewind_attribdir(fs_nspace *ns, fs_node *node, btCookie *cookie); -extern int fs_read_attribdir(fs_nspace *ns, fs_node *node, btCookie *cookie, long *num, struct dirent *buf, size_t bufsize); -extern int fs_remove_attrib(fs_nspace *ns, fs_node *node, const char *name); -extern int fs_stat_attrib(fs_nspace *ns, fs_node *node, const char *name, struct attr_info *buf); - -extern int fs_open_indexdir(fs_nspace *ns, btCookie **cookie); -extern int fs_close_indexdir(fs_nspace *ns, btCookie *cookie); -extern int fs_rewind_indexdir(fs_nspace *ns, btCookie *cookie); -extern int fs_read_indexdir(fs_nspace *ns, btCookie *cookie, long *num, struct dirent *buf, size_t bufsize); -extern int fs_free_indexdircookie(fs_nspace *ns, btCookie *cookie); -extern int fsCreateIndex(fs_nspace *ns, const char *name, int type, int flags); -extern int fsRemoveIndex(fs_nspace *ns, const char *name); -extern int fsStatIndex(fs_nspace *ns, const char *name, struct index_info *buf); - -enum -{ - C_ERROR_STALE=B_ERRORS_END+1 -}; - -#define USE_SYSTEM_AUTHENTICATION 1 - -#endif diff --git a/src/tests/add-ons/kernel/file_systems/beserved/server-Windows/ntservice.suo b/src/tests/add-ons/kernel/file_systems/beserved/server-Windows/ntservice.suo deleted file mode 100644 index 79e20a5c07..0000000000 Binary files a/src/tests/add-ons/kernel/file_systems/beserved/server-Windows/ntservice.suo and /dev/null differ diff --git a/src/tests/add-ons/kernel/file_systems/beserved/transport/beserved_transport.cpp-old b/src/tests/add-ons/kernel/file_systems/beserved/transport/beserved_transport.cpp-old deleted file mode 100644 index b4743cb71f..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/transport/beserved_transport.cpp-old +++ /dev/null @@ -1,203 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include "betalk.h" -#include "beserved_transport.h" -#include "beserved_printer.h" -#include "beserved_rpc.h" -#include "transport_rpc.h" - -#include "LoginPanel.h" -#include "BlowFish.h" - -#define SPOOL_FILE_TYPE "application/x-vnd.Be.printer-spool" - - -#if (!__MWERKS__ || defined(WIN32)) -using namespace std; -#else -#define std -#endif - -BeServedTransport::BeServedTransport(BMessage *msg) - : BDataIO() -{ - server[0] = 0; - printerName[0] = 0; - file[0] = 0; - user[0] = 0; - password[0] = 0; - jobId = 0; - error = false; - - const char *spool_path = msg->FindString(SPOOL_PATH); - if (spool_path && *spool_path) - { - dir.SetTo(spool_path); - - dir.ReadAttr(SERVER_NAME, B_STRING_TYPE, 0, server, sizeof(server)); - dir.ReadAttr(PRINTER_NAME, B_STRING_TYPE, 0, printerName, sizeof(printerName)); - dir.ReadAttr(USER_NAME, B_STRING_TYPE, 0, user, sizeof(user)); - dir.ReadAttr(USER_PASSWORD, B_STRING_TYPE, 0, password, sizeof(password)); - - do - { - sprintf(file, "%s/%lx-%ld", spool_path, time(NULL), jobId++); - } while (access(file, 0) == 0); - - fs.open(file, ios::in | ios::out | ios::binary | ios::trunc); - if (fs.good()) - return; - } - - error = true; -} - -BeServedTransport::~BeServedTransport() -{ - bt_rpcinfo info; - hostent *ent; - char jobName[100], msg[256], *serverJobId, *buffer; - int bytes; - - strcpy(jobName, "BeServed Print Job"); - fs.close(); - - // Get the IP address of the server. - ent = gethostbyname(server); - if (ent == NULL) - { - sprintf(msg, "The server %s, which hosts printer %s, cannot be found on the network.", server, printerName); - BAlert *alert = new BAlert("", msg, "OK"); - alert->Go(); - remove(file); - return; - } - - unsigned int serverIP = ntohl(*((unsigned int *) ent->h_addr)); - buffer = new char [BT_MAX_IO_BUFFER + 10]; - - // Initialize the RPC system. - btRPCInit(&info); - - // Connect to the remote host. - info.s = btConnect(&info, serverIP, BT_TCPIP_PORT); - if (info.s != INVALID_SOCKET) - { - int error; - - // Try to start the new print job. If we get an access denied message, we may need - // to query for new credentials (permissions may have changed on the server since our - // last print job). Keep asking for a new username/password until we either get a - // successful authentication or the user cancels. - while (true) - { - error = btStartPrintJob(&info, printerName, user, password, jobName, &serverJobId); - if (error != EACCES) - break; - else if (!getNewCredentials()) - break; - } - - // If we didn't receive an error, go ahead and read the file in 8K chunks. Send each - // chunk through the RPC protocol, aborting if an error occurs. - if (error == B_OK) - { - FILE *fp = fopen(file, "rb"); - if (fp) - { - do - { - bytes = fread(buffer, 1, BT_MAX_IO_BUFFER, fp); - if (bytes > 0) - { - buffer[bytes] = 0; - if (btPrintJobData(&info, printerName, serverJobId, buffer, bytes) != B_OK) - break; - } - } while (bytes > 0); - - fclose(fp); - } - - // Now that all the data has been transmitted for the print job, start printing by - // committing the job on the server. This ends local responsibility for the task. - // Then it's up to the server. - btCommitPrintJob(&info, printerName, serverJobId); - } - else - { - BAlert *alert = new BAlert("", "Your print job could not be started. This network printer may no longer be available, or you may not have permission to use it.", "OK"); - alert->Go(); - } - - // End our connection with the remote host. - btDisconnect(&info); - } - else - { - sprintf(msg, "The server %s, which hosts printer %s, is not responding.", server, printerName); - BAlert *alert = new BAlert("", msg, "OK"); - alert->Go(); - } - - // Shut down the RPC system. - btRPCClose(&info); - - // Clean up. - delete [] buffer; - remove(file); -} - -ssize_t BeServedTransport::Read(void *, size_t) -{ - return 0; -} - -ssize_t BeServedTransport::Write(const void *buffer, size_t size) -{ - if (!fs.write(buffer, size)) - { - error = true; - return 0; - } - - return size; -} - -bool BeServedTransport::getNewCredentials() -{ - blf_ctx ctx; - int length; - - BRect frame(0, 0, LOGIN_PANEL_WIDTH, LOGIN_PANEL_HEIGHT); - LoginPanel *login = new LoginPanel(frame, server, printerName, false); - login->Center(); - status_t loginExit; - wait_for_thread(login->Thread(), &loginExit); - if (login->IsCancelled()) - return false; - - // Copy the user name. - strcpy(user, login->user); - - // Copy the user name and password supplied in the authentication dialog. - sprintf(password, "%-*s%-*s", B_FILE_NAME_LENGTH, printerName, MAX_USERNAME_LENGTH, login->user); - length = strlen(password); - assert(length == BT_AUTH_TOKEN_LENGTH); - - password[length] = 0; - blf_key(&ctx, (unsigned char *) login->md5passwd, strlen(login->md5passwd)); - blf_enc(&ctx, (unsigned long *) password, length / 4); - - dir.WriteAttr(USER_NAME, B_STRING_TYPE, 0, user, sizeof(user)); - dir.WriteAttr(USER_PASSWORD, B_STRING_TYPE, 0, password, sizeof(password)); - - return true; -} diff --git a/src/tests/add-ons/kernel/file_systems/beserved/transport/beserved_transport.h-old b/src/tests/add-ons/kernel/file_systems/beserved/transport/beserved_transport.h-old deleted file mode 100644 index 329ee508f2..0000000000 --- a/src/tests/add-ons/kernel/file_systems/beserved/transport/beserved_transport.h-old +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef _beserved_transport_h_ -#define _beserved_transport_h_ - -#include -#include -#include -#include -#include - -#include "betalk.h" - - -#if (!__MWERKS__ || defined(WIN32)) -using namespace std; -#else -#define std -#endif - -class BeServedTransport : public BDataIO -{ -public: - BeServedTransport(BMessage *msg); - virtual ~BeServedTransport(); - virtual ssize_t Read(void *buffer, size_t size); - virtual ssize_t Write(const void *buffer, size_t size); - - bool getNewCredentials(); - - bool operator !() const; - bool fail() const; - -private: - char server[256]; - char printerName[256]; - - BDirectory dir; - char file[B_PATH_NAME_LENGTH]; - - char user[MAX_USERNAME_LENGTH + 1]; - char password[BT_AUTH_TOKEN_LENGTH * 2 + 1]; - - int32 jobId; - fstream fs; - bool error; -}; - -inline bool BeServedTransport::fail() const -{ - return error; -} - -inline bool BeServedTransport::operator !() const -{ - return fail(); -} - -#endif