patch-2.1.120 linux/fs/qnx4/symlinks.c
Next file: linux/fs/qnx4/truncate.c
Previous file: linux/fs/qnx4/namei.c
Back to the patch index
Back to the overall index
- Lines: 122
- Date:
Tue Sep 1 10:43:13 1998
- Orig file:
v2.1.119/linux/fs/qnx4/symlinks.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.1.119/linux/fs/qnx4/symlinks.c linux/fs/qnx4/symlinks.c
@@ -0,0 +1,121 @@
+/*
+ * QNX4 file system, Linux implementation.
+ *
+ * Version : 0.1
+ *
+ * Using parts of the xiafs filesystem.
+ *
+ * History :
+ *
+ * 28-05-1998 by Richard Frowijn : first release.
+ * 21-06-1998 by Frank Denis : ugly changes to make it compile on Linux 2.1.99+
+ */
+
+/* THIS FILE HAS TO BE REWRITTEN */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/fs.h>
+#include <linux/qnx4_fs.h>
+#include <linux/stat.h>
+
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+
+static int qnx4_readlink(struct dentry *, char *, int);
+static struct dentry *qnx4_follow_link(struct dentry *, struct dentry *);
+
+/*
+ * symlinks can't do much...
+ */
+struct inode_operations qnx4_symlink_inode_operations =
+{
+ NULL, /* no file-operations */
+#ifdef CONFIG_QNX4FS_RW
+ qnx4_create, /* create */
+#else
+ NULL,
+#endif
+ NULL, /* lookup */
+ NULL, /* link */
+ NULL, /* unlink */
+ NULL, /* symlink */
+ NULL, /* mkdir */
+ NULL, /* rmdir */
+ NULL, /* mknod */
+ NULL, /* rename */
+ qnx4_readlink, /* readlink */
+ qnx4_follow_link, /* follow_link */
+ NULL, /* readpage */
+ NULL, /* writepage */
+ NULL, /* bmap */
+ NULL, /* truncate */
+ NULL /* permission */
+};
+
+static struct dentry *qnx4_follow_link(struct dentry *dentry,
+ struct dentry *base)
+{
+#if 0
+ struct inode *inode = dentry->d_inode;
+ struct buffer_head *bh;
+
+ if (!inode) {
+ return ERR_PTR(-ENOENT);
+ }
+ if (current->link_count > 5) {
+ return ERR_PTR(-ELOOP);
+ }
+ if (!(bh = qnx4_bread(inode, 0, 0))) {
+ return ERR_PTR(-EIO);
+ }
+ current->link_count++;
+ current->link_count--;
+ brelse(bh);
+ return 0;
+#else
+ printk("qnx4: qnx4_follow_link needs to be fixed.\n");
+ return ERR_PTR(-EIO);
+#endif
+}
+
+static int qnx4_readlink(struct dentry *dentry, char *buffer, int buflen)
+{
+ struct inode *inode = dentry->d_inode;
+ struct buffer_head *bh;
+ int i;
+ char c;
+ struct qnx4_inode_info *qnx4_ino;
+
+ QNX4DEBUG(("qnx4: qnx4_readlink() called\n"));
+
+ if (buffer == NULL || inode == NULL || !S_ISLNK(inode->i_mode)) {
+ return -EINVAL;
+ }
+ qnx4_ino = &inode->u.qnx4_i;
+ if (buflen > 1023) {
+ buflen = 1023;
+ }
+ bh = bread(inode->i_dev, qnx4_ino->i_first_xtnt.xtnt_blk,
+ QNX4_BLOCK_SIZE);
+ QNX4DEBUG(("qnx4: qnx4_bread sym called -> [%s]\n",
+ bh->b_data));
+ if (bh == NULL) {
+ QNX4DEBUG(("qnx4: NULL symlink bh\n"));
+ return 0;
+ }
+ if (bh->b_data[0] != 0) {
+ i = 0;
+ while (i < buflen && (c = bh->b_data[i])) {
+ i++;
+ put_user(c, buffer++);
+ }
+ brelse(bh);
+ return i;
+ } else {
+ brelse(bh);
+ memcpy(buffer, "fixme", 5);
+ return 5;
+ }
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov